

<!DOCTYPE html>
<html lang="zh-CN" data-default-color-scheme=&#34;auto&#34;>



<head>
  <meta charset="UTF-8">
  <link rel="apple-touch-icon" sizes="76x76" href="/img/zoro.jpg">
  <link rel="icon" href="/img/zoro.jpg">
  <meta name="viewport"
        content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, shrink-to-fit=no">
  <meta http-equiv="x-ua-compatible" content="ie=edge">
  
  <meta name="theme-color" content="#efb9b9">
  <meta name="description" content="">
  <meta name="author" content="AgoniLay">
  <meta name="keywords" content="">
  
  <title>php笔记 - AgoniLay的博客</title>

  <link  rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css" />


  <link  rel="stylesheet" href="https://cdn.jsdelivr.net/npm/github-markdown-css@4.0.0/github-markdown.min.css" />
  <link  rel="stylesheet" href="/lib/hint/hint.min.css" />

  
    
    
      
      <link  rel="stylesheet" href="https://cdn.jsdelivr.net/npm/highlight.js@10.7.2/styles/arta.min.css" />
    
  

  
    <link  rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.css" />
  



<!-- 主题依赖的图标库，不要自行修改 -->

<link rel="stylesheet" href="//at.alicdn.com/t/font_1749284_ba1fz6golrf.css">



<link rel="stylesheet" href="//at.alicdn.com/t/font_1736178_kmeydafke9r.css">


<link  rel="stylesheet" href="/css/main.css" />

<!-- 自定义样式保持在最底部 -->

  
<link rel="stylesheet" href="/css/scroller.css">
<link rel="stylesheet" href="/css/bynode.css">
<link rel="stylesheet" href="/css/mouse.css">



  <script id="fluid-configs">
    var Fluid = window.Fluid || {};
    var CONFIG = {"hostname":"agonilay.github.io","root":"/","version":"1.8.11","typing":{"enable":true,"typeSpeed":150,"cursorChar":"❤","loop":false},"anchorjs":{"enable":true,"element":"h1,h2,h3,h4,h5,h6","placement":"right","visible":"hover","icon":""},"progressbar":{"enable":true,"height_px":3,"color":"#29d","options":{"showSpinner":false,"trickleSpeed":100}},"copy_btn":true,"image_zoom":{"enable":true,"img_url_replace":["",""]},"toc":{"enable":true,"headingSelector":"h1,h2,h3,h4,h5,h6","collapseDepth":0},"lazyload":{"enable":true,"loading_img":"/img/loading2.gif","onlypost":false,"offset_factor":2},"web_analytics":{"enable":false,"baidu":null,"google":null,"gtag":null,"tencent":{"sid":null,"cid":null},"woyaola":null,"cnzz":null,"leancloud":{"app_id":null,"app_key":null,"server_url":null}},"search_path":"/local-search.xml"};
  </script>
  <script  src="/js/utils.js" ></script>
  <script  src="/js/color-schema.js" ></script>
<meta name="generator" content="Hexo 5.4.0"></head>


<body>
  <header style="height: 70vh;">
    <nav id="navbar" class="navbar fixed-top  navbar-expand-lg navbar-dark scrolling-navbar">
  <div class="container">
    <a class="navbar-brand"
       href="/">&nbsp;<strong>AgoniLay</strong>&nbsp;</a>

    <button id="navbar-toggler-btn" class="navbar-toggler" type="button" data-toggle="collapse"
            data-target="#navbarSupportedContent"
            aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <div class="animated-icon"><span></span><span></span><span></span></div>
    </button>

    <!-- Collapsible content -->
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav ml-auto text-center">
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/">
                <i class="iconfont icon-home-fill"></i>
                首页
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item dropdown">
              <a class="nav-link dropdown-toggle" target="_self" role="button"
                 data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                <i class="iconfont icon-bookmark"></i>
                索引
              </a>
              <div class="dropdown-menu" aria-labelledby="navbarDropdown">
                
                  
                  
                  
                  <a class="dropdown-item" href="/archives/">
                    <i class="iconfont icon-archive-fill"></i>
                    归档
                  </a>
                
                  
                  
                  
                  <a class="dropdown-item" href="/categories/">
                    <i class="iconfont icon-category-fill"></i>
                    分类
                  </a>
                
                  
                  
                  
                  <a class="dropdown-item" href="/tags/">
                    <i class="iconfont icon-tags-fill"></i>
                    标签
                  </a>
                
              </div>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/about/">
                <i class="iconfont icon-user-fill"></i>
                关于
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/links/">
                <i class="iconfont icon-link-fill"></i>
                友链
              </a>
            </li>
          
        
          
        
          <li class="nav-item" id="search-btn">
            <a class="nav-link" target="_self" data-toggle="modal" data-target="#modalSearch">&nbsp;<i
                class="iconfont icon-search"></i>&nbsp;</a>
          </li>
        
        
          <li class="nav-item" id="color-toggle-btn">
            <a class="nav-link" target="_self">&nbsp;<i
                class="iconfont icon-dark" id="color-toggle-icon"></i>&nbsp;</a>
          </li>
        
      </ul>
    </div>
  </div>
</nav>

    <div class="banner" id="banner" parallax=true
         style="background: url('/img/zoro2.jpg') no-repeat center center;
           background-size: cover;">
      <div class="full-bg-img">
        <div class="mask flex-center" style="background-color: rgba(0, 0, 0, 0.3)">
          <div class="page-header text-center fade-in-up">
            <span class="h3" id="subtitle" title="php笔记">
              
            </span>

            
              <div class="mt-3">
  
    <span class="post-meta mr-2">
      <i class="iconfont icon-author" aria-hidden="true"></i>
      AgoniLay
    </span>
  
  
    <span class="post-meta">
      <i class="iconfont icon-date-fill" aria-hidden="true"></i>
      <time datetime="2021-07-29 23:32" pubdate>
        2021年7月29日 晚上
      </time>
    </span>
  
</div>

<div class="mt-1">
  

  
    
    <span class="post-meta mr-2">
      <i class="iconfont icon-clock-fill"></i>
      
      
      359
       分钟
    </span>
  

  
  
    
      <!-- 不蒜子统计文章PV -->
      <span id="busuanzi_container_page_pv" style="display: none">
        <i class="iconfont icon-eye" aria-hidden="true"></i>
        <span id="busuanzi_value_page_pv"></span> 次
      </span>
    
  
</div>

            
			
			
          </div>

          
        </div>
      </div>
    </div>
  </header>

  <main>
    
      

<div class="container-fluid nopadding-x">
  <div class="row nomargin-x">
    <div class="d-none d-lg-block col-lg-2"></div>
    <div class="col-lg-8 nopadding-x-md">
      <div class="container nopadding-x-md" id="board-ctn">
        <div class="py-5" id="board">
          <article class="post-content mx-auto">
            <!-- SEO header -->
            <h1 style="display: none">php笔记</h1>
            
            <div class="markdown-body">
              <h2 id="错误解决"><a href="#错误解决" class="headerlink" title="错误解决"></a>错误解决</h2><h4 id="中文乱码"><a href="#中文乱码" class="headerlink" title="中文乱码"></a>中文乱码</h4><p>开头添加：</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php">header(<span class="hljs-string">&quot;Content-Type: text/html; charset=utf-8&quot;</span>);<br></code></pre></div></td></tr></table></figure>

<h2 id="PHP-简介"><a href="#PHP-简介" class="headerlink" title="PHP 简介"></a>PHP 简介</h2><h4 id="什么是-PHP"><a href="#什么是-PHP" class="headerlink" title="什么是 PHP"></a>什么是 PHP</h4><h5 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h5><p>一种服务器端的 HTML 脚本/编程语言,是一种简单的、面向对象的、解释型的、健壮的、安全的、性能非常之高的、独立于架构的、可移植的、动态的脚本语言。是一种广泛用于 Open Source（开放源代码）的尤其适合 Web 开发并可以嵌入 HTML 的多用途脚本语言。它的语法接近 C，Java 和 Perl，而且容易学习。</p>
<p>该语言让 Web 开发人员快速的书写动态生成的网页</p>
<h5 id="前身"><a href="#前身" class="headerlink" title="前身"></a>前身</h5><p>Personal HomePage：个人主页，使用Perl语言开发的一种写个人主页的语言</p>
<p>PHP：PHP Hypertext Preprosessor， php 超文本预处理器，底层使用C语言</p>
<h4 id="PHP发展史"><a href="#PHP发展史" class="headerlink" title="PHP发展史"></a>PHP发展史</h4><p>…</p>
<p>平台支持（window，Linux，UNIX）</p>
<p>数据库支持（Sqlserver，mysql，Oracle，Access）</p>
<h4 id="网站"><a href="#网站" class="headerlink" title="网站"></a>网站</h4><h5 id="静态网站特点"><a href="#静态网站特点" class="headerlink" title="静态网站特点"></a>静态网站特点</h5><ol>
<li>网页内容一经发布到网站服务器上，无论是否有用户访问，每个静态网页的内容都是保存在网站服务器上的，也就是说，静态网页是实实在在保存在服务器上的文件，每个网页都是一个独立的文件；</li>
<li>静态网页的内容相对稳定，因此<strong>容易被搜索引擎检索</strong>；</li>
<li>静态网页<strong>没有数据库的支持</strong>，在网站制作和维护方面工作量较大，因此当网站信息量很大时完全依靠静态网页制作方式比较困难；</li>
<li>静态网页的<strong>交互性较差</strong>，在功能方面有较大的限制。</li>
</ol>
<h5 id="动态网站特点"><a href="#动态网站特点" class="headerlink" title="动态网站特点"></a>动态网站特点</h5><ol>
<li><p>交互性：网页会根据用户的要求和选择而动态地改变和响应，浏览器作为客户端，成为一个动态交流的桥梁，动态网页的交互性也是今后Web发展的潮流。</p>
</li>
<li><p>自动更新：即无须手动更新HTML文档，便会自动生成新页面，可以大大节省工作量。</p>
</li>
<li><p>因时因人而变：即当不同时间、不同用户访问同一网址时会出现不同页面。</p>
<p>此外动态网页是与静态网页相对应的，也就是说，网页 URL 的后缀不是 .htm、.html、.shtml、.xml 等静态网页的常见形式，而是以 .asp、.jsp、.php、.perl、.cgi 等形式为后缀。在动态网页网址中有一个标志性的符号——“?”</p>
</li>
</ol>
<h2 id="网站基本概念"><a href="#网站基本概念" class="headerlink" title="网站基本概念"></a>网站基本概念</h2><h4 id="服务器"><a href="#服务器" class="headerlink" title="服务器"></a>服务器</h4><p>服务器：能够提供服务的机器，取决于机器上所安装的软件（服务软件）</p>
<p>Web服务器：提供web服务（网站访问），就需要安装web服务软件 Apache，tomcat，iis 等</p>
<h4 id="IP"><a href="#IP" class="headerlink" title="IP"></a>IP</h4><p>Internet Protocol，网络之间互联协议。网络之间互连的协议也就是为计算机网络相互连接进行通信而设计的协议</p>
<p>IP地址具有<strong>唯一性</strong>（每台电脑都有一个唯一的IP地址）</p>
<h4 id="域名"><a href="#域名" class="headerlink" title="域名"></a>域名</h4><p>Domain Name，是由一串用点分隔的名字组成（<a target="_blank" rel="noopener" href="http://www.itcast.cn)的/">www.itcast.cn）的</a> Internet 上某一台计算机或计算机组的名称</p>
<p>一个域名的目的是便于记忆和沟通的一组服务器的地址（网站，电子邮件，FTP等）。域名作为力所能及难忘的互联网参与者的名称</p>
<p>特殊IP：127.0.0.1，代表本机</p>
<p>特殊域名：localhost</p>
<h4 id="DNS"><a href="#DNS" class="headerlink" title="DNS"></a>DNS</h4><p>Domain Name System，域名系统</p>
<p>通过主机名，最终得到该主机名对应的IP地址的过程叫做域名解析（或主机名解析）</p>
<p>用户输入域名 localhost  –&gt;  DNS（localhost 127.0.0.1）–&gt;  服务器电脑</p>
<h4 id="端口"><a href="#端口" class="headerlink" title="端口"></a>端口</h4><p>Port，可以认为是设备与外界通讯交流的出口。端口可分为<strong>虚拟端口</strong>和<strong>物理端口</strong>，其中虚拟端口指计算机内部或交换机路由器内的端口，不可见。</p>
<p>用户输入域名 localhost:端口  –&gt;  DNS（localhost 127.0.0.1）–&gt;  服务器电脑 –&gt; 软件（服务）</p>
<h2 id="Web-程序的访问流程"><a href="#Web-程序的访问流程" class="headerlink" title="Web 程序的访问流程"></a>Web 程序的访问流程</h2><p>Web分为两类：静态网站和动态网站</p>
<p>浏览器发起访问  –&gt;  DNS解析域名  –&gt;  服务器电脑  –&gt;  服务软件</p>
<h4 id="静态网站的访问"><a href="#静态网站的访问" class="headerlink" title="静态网站的访问"></a>静态网站的访问</h4><p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627153514946.png" srcset="/img/loading2.gif" lazyload></p>
<h4 id="动态网站的访问"><a href="#动态网站的访问" class="headerlink" title="动态网站的访问"></a>动态网站的访问</h4><p>动态网站访问流程与静态差不多，但是会多出几个内容：服务器端解析、数据库</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627154927756.png" srcset="/img/loading2.gif" lazyload></p>
<h2 id="安装-Apache"><a href="#安装-Apache" class="headerlink" title="安装 Apache"></a>安装 Apache</h2><h4 id="安装-Apache-软件"><a href="#安装-Apache-软件" class="headerlink" title="安装 Apache 软件"></a>安装 Apache 软件</h4><ol>
<li><p>获取 Apache 软件</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627160153744.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>双击安装即可：指定对应路径</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627160215862.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>选择安装模式：使用自定义</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627160314247.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>选择安装位置</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627160438991.png" srcset="/img/loading2.gif" lazyload></p>
</li>
</ol>
<h4 id="Apache-的目录结构说明"><a href="#Apache-的目录结构说明" class="headerlink" title="Apache 的目录结构说明"></a>Apache 的目录结构说明</h4><p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627160730828.png" srcset="/img/loading2.gif" lazyload></p>
<h4 id="Httpd-exe-的详细应用"><a href="#Httpd-exe-的详细应用" class="headerlink" title="Httpd.exe 的详细应用"></a>Httpd.exe 的详细应用</h4><ol>
<li><p>服务器进程：运行之后才能够工作</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627161153791.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>用来查看Apache具有哪些功能以及配置文件是否有错：httpd 或者 httpd.exe（文件所在目录）</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627161416719.png" srcset="/img/loading2.gif" lazyload></p>
<ol>
<li><p>查看使用的模块：httpd.exe -M</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627161553233.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>验证配置文件是否有效：httpd -t</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627161837622.png" srcset="/img/loading2.gif" lazyload></p>
</li>
</ol>
</li>
</ol>
<h2 id="配置默认站点"><a href="#配置默认站点" class="headerlink" title="配置默认站点"></a>配置默认站点</h2><ol>
<li><p>让 Apache 确定服务器上访问的位置：网站文件夹所在位置</p>
<p>Httpd.conf： DocumentRoot</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627170307785.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>方便用户使用名字访问对应网站：给文件夹对应的起一个别名</p>
<p>Httpd.conf： ServerName</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627162507164.png" srcset="/img/loading2.gif" lazyload></p>
<p>端口可以单独实现：httpd.conf： listen</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627162551195.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p><strong>凡是涉及到 Apache 配置问价的修改，那么需要重启 Apache 才能生效</strong> </p>
</li>
<li><p>实现 DNS 域名解析：通常默认站点都是本地 DNS：hosts 文件</p>
<p>C:\Windows\System32\drivers\etc 下 hosts 文件</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627163009596.png" srcset="/img/loading2.gif" lazyload></p>
</li>
</ol>
<h2 id="安装与配置-PHP"><a href="#安装与配置-PHP" class="headerlink" title="安装与配置 PHP"></a>安装与配置 PHP</h2><h4 id="安装-PHP-语言"><a href="#安装-PHP-语言" class="headerlink" title="安装 PHP 语言"></a>安装 PHP 语言</h4><ol>
<li><p>获取PHP安装文件：建议去官网</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627163637004.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>解压缩</p>
</li>
<li><p>安装：将压缩包放到 D:/server/ ，重命名 php5</p>
</li>
</ol>
<h4 id="PHP-目录结构说明"><a href="#PHP-目录结构说明" class="headerlink" title="PHP 目录结构说明"></a>PHP 目录结构说明</h4><p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627164042157.png" srcset="/img/loading2.gif" lazyload></p>
<h4 id="php-exe-的应用"><a href="#php-exe-的应用" class="headerlink" title="php.exe 的应用"></a>php.exe 的应用</h4><p>php.exe 就是可以解析PHP代码转变成HTML代码从而让浏览器可以解析的。</p>
<ol>
<li><p>通过CMD控制器进入到php.exe所在目录</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627164214834.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>通过 php.exe 运行命令来指定要解析的 PHP脚本 就可以：<code>php.exe  -f</code>  PHP文件所在路径</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627164948370.png" srcset="/img/loading2.gif" lazyload></p>
</li>
</ol>
<h2 id="配置-Apache-加载-PHP-模块"><a href="#配置-Apache-加载-PHP-模块" class="headerlink" title="配置 Apache 加载 PHP 模块"></a>配置 Apache 加载 PHP 模块</h2><ol>
<li><p>Apache 加载 PHP 模块：在 Apache 的主配置文件（httpd.conf）中加载对应的 PHP 提供的模块</p>
<p><code>LoadModule php5_module &#39;D:/server/php5/php5apache2_2.dll&#39;</code> </p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627170739713.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>Apache 分配工作给 PHP 模块：如果是 PHP 代码就交给 PHP 处理：文件后缀判断 .php 结尾肯定是 PHP 代码</p>
<p><code>AddType application/x-httpd-php .php</code> </p>
</li>
<li><p>将 PHP 的配置文件加载到 Apache 配置文件中：共同生效</p>
<ol>
<li><p>在 Apache 中指定 PHP 配置文件所在路径</p>
<p>PHPIniDir php.ini所在路径</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627172103347.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>php.ini 文件默认是不存在的，是以 development 和 production 格式存在，需要格式化</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627172829719.png" srcset="/img/loading2.gif" lazyload></p>
</li>
</ol>
<p>说明：PHP 的配置文件已经加入到 Apache 的配置项中，意味着 php.ini 的修改需要 Apache 重启才会生效。</p>
</li>
</ol>
<h2 id="安装与配置-MySQL"><a href="#安装与配置-MySQL" class="headerlink" title="安装与配置 MySQL"></a>安装与配置 MySQL</h2><h4 id="安装-MySQL-软件"><a href="#安装-MySQL-软件" class="headerlink" title="安装 MySQL 软件"></a>安装 MySQL 软件</h4><h4 id="MySQL-目录结构说明"><a href="#MySQL-目录结构说明" class="headerlink" title="MySQL 目录结构说明"></a>MySQL 目录结构说明</h4><p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627231602204.png" srcset="/img/loading2.gif" lazyload></p>
<h4 id="Bin-目录的常用命令"><a href="#Bin-目录的常用命令" class="headerlink" title="Bin 目录的常用命令"></a>Bin 目录的常用命令</h4><p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627231701378.png" srcset="/img/loading2.gif" lazyload></p>
<p>软件设计结构：C/S 和 B/S</p>
<p>C/S：Client客户端/Server服务端，用户需要安装客户端产品才能访问服务器，而且只能访问一种软件（当前自己）</p>
<p>B/S：Browser浏览器/Server服务端，用户只需要安装浏览器，就可以访问所有的服务器（B/S架构服务）</p>
<h2 id="MySQL-访问流程"><a href="#MySQL-访问流程" class="headerlink" title="MySQL 访问流程"></a>MySQL 访问流程</h2><p>Mysql 是一款 C/S 架构的软件，需要通过客户端来访问服务端（MySQL 提示也提供了其他模式的访问：通过一些插件扩展来充当客户端）</p>
<ol>
<li><p>启用 MySQL 客户端： mysql.exe，该软件本身可以通过 CMD 控制台运行</p>
</li>
<li><p>MySQL客户端访问服务端需要进行寻找匹配：连接认证</p>
<p>连接：IP和端口确认，如果是本地都可以省略</p>
<p>-h 主机地址 –&gt; -hlocalhost（可以是 IP）</p>
<p>-P 端口 –&gt; -P3306</p>
<p>认证：通过用户名和密码进入服务器</p>
<p>-u 用户名 –&gt; -uroot，不可以省略（匿名用户除外）</p>
<p>-p 密码 –&gt; -proot</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627234054183.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>退出命令</p>
<p><code>\q</code> </p>
</li>
</ol>
<p>注意：通常连接认证的时候密码不建议明文，可以再输入 -p 之后回车，系统会再次让输入密码，这个时候就是密文</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627234340617.png" srcset="/img/loading2.gif" lazyload></p>
<h2 id="PHP-连接-MySQL-数据库"><a href="#PHP-连接-MySQL-数据库" class="headerlink" title="PHP 连接 MySQL 数据库"></a>PHP 连接 MySQL 数据库</h2><p>PHP 本身不具备操作 MySQL 数据库的能力，需要借助 PHP 操作 MySQL 的扩展来实现</p>
<ol>
<li><p>PHP 加载 MySQL 扩展：php.ini 文件</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627234726830.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>PHP 所有的扩展都是在 ext 文件夹中，需要制定扩展所在路径： extension_dir</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210627235322277.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>php.ini 已经被 Apache 加载，所以需要重启</p>
</li>
</ol>
<p>如果出错，尝试设置：</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628002453049.png" srcset="/img/loading2.gif" lazyload></p>
<h2 id="设定-PHP-的系统时区"><a href="#设定-PHP-的系统时区" class="headerlink" title="设定 PHP 的系统时区"></a>设定 PHP 的系统时区</h2><p>通过 php.ini 中的 timezone 配置项来实现</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php">; 增加时区<br>date.timezone = PRC<br></code></pre></div></td></tr></table></figure>

<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628002923832.png" srcset="/img/loading2.gif" lazyload></p>
<h2 id="配置虚拟主机"><a href="#配置虚拟主机" class="headerlink" title="配置虚拟主机"></a>配置虚拟主机</h2><p>一台服务器很贵，如果只能部署一个网站，那么非常浪费。所以需要通过其他渠道来实现一台主机上部署多个网站。</p>
<h4 id="什么是虚拟主机"><a href="#什么是虚拟主机" class="headerlink" title="什么是虚拟主机"></a>什么是虚拟主机</h4><p>虚拟主机：Virtual machine，并不存在真实的主机，但是可以提供真实主机所实现的功能。</p>
<p>通俗的讲，虚拟主机就是将计算机中不同的文件夹进行不同的命名，然后可以实现让服务器（Apache）根据用户的需求从不同的文件夹（网站）中读取不同的内容。</p>
<h4 id="虚拟主机的分类"><a href="#虚拟主机的分类" class="headerlink" title="虚拟主机的分类"></a>虚拟主机的分类</h4><p>在Apache中，可以将虚拟主机划分成两类：</p>
<ol>
<li><p>基于IP的虚拟主机：一台电脑上有多个IP，每个IP对应一个网站</p>
<p>原理：电脑默认只有一个IP，因为通常只配有一个网卡；但是有的电脑（服务器居多）可以配置多个网卡，每个网卡可以绑定一个IP地址。</p>
</li>
<li><p>基于域名的虚拟主机：一台电脑上只有一个IP，但是IP下可以制作多个网站，但是需要给每个网站不同的名字（虚拟主机名）</p>
</li>
</ol>
<h2 id="搭建基于域名的虚拟主机"><a href="#搭建基于域名的虚拟主机" class="headerlink" title="搭建基于域名的虚拟主机"></a>搭建基于域名的虚拟主机</h2><p>在Apache中，虚拟主机的搭建有两种方式：</p>
<ol>
<li><p>在主配置文件中搭建：需要手动开启虚拟主机（基于域名）</p>
<p>NameVirtualHost *:80</p>
</li>
<li><p>在专门的虚拟主机配置文件中配置</p>
<ol>
<li><p>在主配置文件中加载虚拟主机配置文件(httpd.conf)：虚拟主机配置文件已经开启了虚拟主机 NameVirtualHost</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628004217698.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>虚拟主机从配置文件（extra/httpd-vhosts.conf）中配置虚拟主机</p>
<ol>
<li><p>增加一个对应的站点文件夹位置：</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628004550155.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>增加主机名字：文件夹的别名：ServerName</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628004830659.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>增加域名解析 DNS：(hosts 文件)</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628005736269.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>需要给当前设定的站点（目录）访问权限</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php">&lt;<span class="hljs-built_in">Directory</span> <span class="hljs-string">&#x27;站点目录&#x27;</span>&gt;<br>    Order Deny,Allow	<span class="hljs-comment">// 没有顺序关系：实际顺序有关系</span><br>    Deny <span class="hljs-keyword">from</span> 指定的范围<br>    Allow <span class="hljs-keyword">from</span> 指定范围<br>&lt;/<span class="hljs-built_in">Directory</span>&gt;<br></code></pre></div></td></tr></table></figure>

<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628010552694.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>配置访问列表：当访问是一个目录时（没有指定具体要访问的文件）</p>
<p>Options Indexes [FollowSymLinks]，如果访问目录，那么列表显示所有文件</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628011114358.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>当用户访问指定目录不指定文件的时候，通常需要系统指定一个默认文件</p>
<p>DirectoryIndex 默认的文件列表，使用空格分离</p>
<p>注意：如果网站中整个网站根目录允许访问，但是其中还有其他文件夹不允许访问：可以增加多个 Directory 标签，针对不同文件夹</p>
</li>
</ol>
</li>
<li><p>一旦启用虚拟主机配置文件，那么默认的主机地址 localhost 就不再生效，如果想要生效：为 localhost 增加单独的虚拟主机</p>
</li>
</ol>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628011958112.png" srcset="/img/loading2.gif" lazyload></p>
</li>
</ol>
<h2 id="PHP-基础"><a href="#PHP-基础" class="headerlink" title="PHP 基础"></a>PHP 基础</h2><h3 id="PHP-语法初步"><a href="#PHP-语法初步" class="headerlink" title="PHP 语法初步"></a>PHP 语法初步</h3><p>PHP 是一种运行在服务器端的脚本语言，可以嵌入到HTML中。</p>
<h4 id="PHP-代码标记"><a href="#PHP-代码标记" class="headerlink" title="PHP 代码标记"></a>PHP 代码标记</h4><p>在PHP历史发展中，可以使用多种标记来区分PHP脚本</p>
<ul>
<li>ASP标记： <code>&lt;% php代码 %&gt;</code> </li>
<li>短标记： <code>&lt;? php代码 ?&gt;</code> </li>
</ul>
<p>以上两种基本弃用，如果要使用那么需要在配置文件中开启</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628093541586.png" srcset="/img/loading2.gif" lazyload></p>
<ul>
<li>脚本标记： <code>&lt;script lang=&quot;php&quot;&gt; php代码 &lt;/script&gt;</code> </li>
</ul>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628094015744.png" srcset="/img/loading2.gif" lazyload alt="image-20210628094015744"></p>
<ul>
<li>标准标记（常用）： <code>&lt;?php php代码 ?&gt;</code> </li>
</ul>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628094749928.png" srcset="/img/loading2.gif" lazyload></p>
<h4 id="PHP-注释"><a href="#PHP-注释" class="headerlink" title="PHP 注释"></a>PHP 注释</h4><p>习惯：所有的代码在写的过程中都必须进行注释</p>
<p>PHP 中注释分为两种</p>
<ul>
<li><p>行注释：一次注释一行</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php"><span class="hljs-comment">// ：后面跟的所有内容都是注释</span><br><br><span class="hljs-comment"># ：与 // 一样</span><br></code></pre></div></td></tr></table></figure></li>
<li><p>块注释：一次注释多行</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php"><span class="hljs-comment">/* : 直到下面出现之前中间全部都是注释</span><br><span class="hljs-comment"></span><br><span class="hljs-comment">*/</span><br></code></pre></div></td></tr></table></figure>

<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628100126110.png" srcset="/img/loading2.gif" lazyload></p>
</li>
</ul>
<h4 id="PHP-语句分隔符"><a href="#PHP-语句分隔符" class="headerlink" title="PHP 语句分隔符"></a>PHP 语句分隔符</h4><p>语句分隔符：在 PHP 中，代码是以行尾单位，系统需要通过判断行的解说，该结束通常都是一个符号：英文分号 <code>;</code> </p>
<p>特殊说明：</p>
<ol>
<li>PHP中标记结束符?&gt;有自带语句结束符的效果，最后一行PHP代码可以没有语句结束符 <code>;</code> （不建议）</li>
<li>PHP中其实很多代码的书写并不是嵌入到HTML中，而是单独存在，通常书写习惯中就不建议使用标记结束符?&gt;，PHP会自动从开始到最后全部认为是PHP代码，从而解析</li>
</ol>
<h3 id="变量"><a href="#变量" class="headerlink" title="变量"></a>变量</h3><h4 id="概念"><a href="#概念" class="headerlink" title="概念"></a>概念</h4><ol>
<li>变量是用来存储数据的；</li>
<li>变量是存在名字的；</li>
<li>变量是通过名字来访问的：数据；</li>
<li>变量是可以改变的：数据。</li>
</ol>
<h4 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h4><p>PHP中的所有变量都必须使用 <code>$</code> 符号</p>
<ol>
<li>定义：在系统中增加对应的变量名字（内存）</li>
<li>赋值：可以将数据赋值给变量名（可以在定义的同时完成）</li>
<li>可以通过变量名访问存储的数据</li>
<li>可以将变量从内存中删除</li>
</ol>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628102030737.png" srcset="/img/loading2.gif" lazyload></p>
<h4 id="命名规则"><a href="#命名规则" class="headerlink" title="命名规则"></a>命名规则</h4><ol>
<li>在PHP中变量名字必须以“$”符号开始；</li>
<li>名字由字母、数字和下划线“_”构成，但是不能以数字开头；</li>
<li>在PHP中本身还允许中文变量（不建议）。</li>
</ol>
<h4 id="预定义变量"><a href="#预定义变量" class="headerlink" title="预定义变量"></a>预定义变量</h4><p>预定义变量：提前定义的变量，系统定义的变量，存储许多需要用到的数据（预定义变量都是数组）</p>
<ul>
<li><p><strong>$_GET</strong>：获取所有表单以get方式提交的数据</p>
</li>
<li><p><strong>$_POST</strong>：POST提交的数据都会保存在此</p>
</li>
<li><p><strong>$_REQUEST</strong>：GET和POST提交的都会保存</p>
</li>
<li><p>$GLOBALS：PHP中所有的全局变量</p>
</li>
<li><p><strong>$_SERVER</strong>：服务器信息</p>
</li>
<li><p><strong>$_SESSION</strong>：session会话数据</p>
</li>
<li><p><strong>$_COOKIE</strong>：cookie会话数据</p>
</li>
<li><p>$_ENV：环境信息（用的较少）</p>
</li>
<li><p>$_FILES：用户上传的文件信息</p>
</li>
</ul>
<h4 id="可变变量"><a href="#可变变量" class="headerlink" title="可变变量"></a>可变变量</h4><p>如果一个变量保存的值刚好是另外一个变量的名字，那么可以直接通过访问一个变量得到另外一个变量的值：在变量前面再多加一个$符号。</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628104114494.png" srcset="/img/loading2.gif" lazyload></p>
<h4 id="变量传值"><a href="#变量传值" class="headerlink" title="变量传值"></a>变量传值</h4><p>将一个变量赋值给另外一个变量：变量传值</p>
<p>变量传值一共有两种方式：值传递，引用传递</p>
<ul>
<li><p>值传递：将变量保存的值赋值一份，然后将新的值给另外一个变量保存（两个变量没有关系）</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628105219725.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>引用传递：将变量保存的值所在的内存地址，传递给另外一个变量：两个变量指向同一块内存空间（两个变量是同一个值）</p>
<p><code>$新变量 = &amp;$老变量;</code> </p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628105345581.png" srcset="/img/loading2.gif" lazyload></p>
</li>
</ul>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628110156014.png" srcset="/img/loading2.gif" lazyload></p>
<p>在内存中，通常有以下几个分区</p>
<ul>
<li>栈区：程序可以操作的内存部分（不存数据，运行程序代码），少但是快</li>
<li>代码段：存储程序的内存部分（不执行）</li>
<li>数据段：存储普通数据（全局区和静态区）</li>
<li>堆区：存储复杂数据，大但是效率低</li>
</ul>
<h3 id="常量"><a href="#常量" class="headerlink" title="常量"></a>常量</h3><p>常量与变量一样，都是用来保存数据的。</p>
<h4 id="基本概念"><a href="#基本概念" class="headerlink" title="基本概念"></a>基本概念</h4><p>常量：const / constant，是一种在程序运行当中，不可改变的量（数据）</p>
<p>常量一旦定义，通常数据不可改变（用户级别）</p>
<h4 id="定义形式"><a href="#定义形式" class="headerlink" title="定义形式"></a>定义形式</h4><p>在PHP中常量有两种定义方式（5.3之后才有两种）</p>
<ol>
<li>使用定义常量的函数：define(‘常量名’,常量值);</li>
<li> php5.3 之后才有的：const 常量名 = 值;</li>
</ol>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628110809490.png" srcset="/img/loading2.gif" lazyload></p>
<h4 id="命名规则-1"><a href="#命名规则-1" class="headerlink" title="命名规则"></a>命名规则</h4><ol>
<li><p>常量不需要使用“$”符号，一旦使用系统就会认为是变量；</p>
</li>
<li><p>常量的名字组成由字母、数字和下划线组成，不能以数字开头；</p>
</li>
<li><p>常量的名字通常是以 <strong>大写字母</strong> 为主（与变量以示区别）；</p>
</li>
<li><p>常量命名的规则比变量要松散，可以使用一些特殊字符，该方式只能使用define定义；</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628111008222.png" srcset="/img/loading2.gif" lazyload></p>
</li>
</ol>
<p>注意细节：</p>
<ol>
<li>Define和const定义的常量是有区别：在于访问权限区别</li>
<li>定义常量通常不区分大小写，但是可以区分，可以参照define函数的第三个参数</li>
</ol>
<h4 id="使用形式"><a href="#使用形式" class="headerlink" title="使用形式"></a>使用形式</h4><p>常量的使用与变量一样：但是不可改变值（在定义的时候必须赋值）</p>
<p>有的时候还需要使用另外一种形式来访问（针对的是特殊名字的常量），需要用到另外一个访问常量的函数：constant(‘常量名’)</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628111559972.png" srcset="/img/loading2.gif" lazyload></p>
<p>说明：常量和变量的使用</p>
<ol>
<li>凡是数据会可能变化的，那么肯定是用变量</li>
<li>数据不一定会变的，可以使用常量或者变量（变量居多）</li>
<li>数据不允许被修改的，一定用常量</li>
</ol>
<h4 id="系统常量"><a href="#系统常量" class="headerlink" title="系统常量"></a>系统常量</h4><p>系统常量：系统帮助用户定义的常量，用户可以直接使用</p>
<p>常用的几个系统常量：</p>
<ul>
<li><p>PHP_VERSION： PHP版本号</p>
</li>
<li><p>PHP_INT_SIZE： 整形大小</p>
</li>
<li><p>PHP_INT_MAX： 整形能表示的最大值（PHP中整形是允许出现负数：带符号）</p>
</li>
</ul>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628112021974.png" srcset="/img/loading2.gif" lazyload></p>
<p>在PHP中还有一些特殊的常量，他们有双下划线开始+长两名+双下划线结束，这种常量称之为系统 魔术常量：魔术常量的值通常会跟着环境变化，但是用户改变不了</p>
<ul>
<li><code>__DIR__</code>：当前被执行的脚本所在电脑的绝对路径</li>
<li><code>__FILE__</code>：当前被执行的脚本所在的电脑的绝对路径（带自己文件的名字）</li>
<li><code>__LINE__</code>：当前所属的行数</li>
</ul>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628112651317.png" srcset="/img/loading2.gif" lazyload></p>
<ul>
<li><code>__NAMESPACE__</code>：当前所属的命名空间</li>
<li><code>__CLASS__</code>：当前所属的类</li>
<li><code>__METHOD__</code>：当前所属的方法</li>
</ul>
<h3 id="数据类型"><a href="#数据类型" class="headerlink" title="数据类型"></a>数据类型</h3><p>数据类型：data type，在PHP中指的是存储的数据本身的类型，而不是变量的类型。PHP是一种弱类型语言，变量本身没有数据类型。</p>
<h4 id="PHP-的八种数据类型"><a href="#PHP-的八种数据类型" class="headerlink" title="PHP 的八种数据类型"></a>PHP 的八种数据类型</h4><p>在PHP中将数据分为三大类八小类：</p>
<ul>
<li><p>简单（基本）数据类型：4个小类</p>
<ul>
<li>整型：int/integer，系统分配4个字节存储，表示整数类型（有前提：存的下）</li>
<li>浮点型：float/double，系统分配8个字节存储，表示小数或者整型存不下的整数</li>
<li>字符串型：string，系统根据实际长度分配，表示字符串（引号 ‘’ 或 “” ）</li>
<li>布尔类型：bool/boolean，表示布尔类型，只有两个值：true和false</li>
</ul>
</li>
<li><p>复合数据类型：2个小类</p>
<ul>
<li>对象类型：object，存放对象（面向对象）</li>
<li>数组类型：array，存储多个数据（一次性）</li>
</ul>
</li>
<li><p>特殊数据类型：2个小类</p>
<ul>
<li>资源类型：resource，存放资源数据（PHP外部数据，如数据库、文件）</li>
<li>空类型：NULL，只有一个值就是NULL（不能运算）</li>
</ul>
</li>
</ul>
<h4 id="类型转换"><a href="#类型转换" class="headerlink" title="类型转换"></a>类型转换</h4><p>类型转换：在很多的条件下，需要指定的数据类型，需要外部数据（当前PHP取得的数据），转换成目标数据类型</p>
<p>在PHP中有两种类型转换方式：</p>
<ol>
<li><p>自动转换：系统根据需求自己判定，自己转换（用的比较多，效率偏低）</p>
</li>
<li><p>强制（手动）转换：人为根据需要的目标类型转换</p>
<p>强制转换规则：在变量之前增加一个括号()，然后在里面写上对应类型：int/integer….其中NULL类型用到unset()</p>
</li>
</ol>
<p>在转换过程中用到比较多的就是转布尔类型（判断）和转数值类型（算数运算）</p>
<p>其他类型转布尔类型：true或者false，在 PHP 中比较少类型换变成false</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628113541600.png" srcset="/img/loading2.gif" lazyload></p>
<p>其他类型转数值的说明：</p>
<ol>
<li><p>布尔true为1，false为0；</p>
</li>
<li><p>字符串转数值有自己的规则</p>
<ol>
<li><p>以字母开头的字符串，永远为0；</p>
</li>
<li><p>以数字开头的字符串，取到碰到字符串为止（不会同时包含两个小数点）</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628114334753.png" srcset="/img/loading2.gif" lazyload></p>
</li>
</ol>
</li>
</ol>
<h4 id="类型判断"><a href="#类型判断" class="headerlink" title="类型判断"></a>类型判断</h4><p>通过一组类型判断函数，来判断变量，最终返回这个变量所保存数据的数据类型（相同结果为true，失败为false）：是一组以is_开头后面跟类型名字的函数：</p>
<div class="hljs code-wrapper"><pre><code>`is_xxx(变量名)` 
</code></pre></div>
<p>Bool 类型不能用 echo 来查看，可以使用 var_dump 结构查看：</p>
<div class="hljs code-wrapper"><pre><code>`var_dump(变量1,变量2…)` 
</code></pre></div>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628124820018.png" srcset="/img/loading2.gif" lazyload></p>
<p>还有一组函数可以用来获取以及设定数据（变量）的类型</p>
<div class="hljs code-wrapper"><pre><code>gettype(变量名)：获取类型，得到的是该类型对应的字符串
</code></pre></div>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628131733521.png" srcset="/img/loading2.gif" lazyload></p>
<div class="hljs code-wrapper"><pre><code>settype(变量名,类型)：设定数据类型：与强制转换不同
</code></pre></div>
<ol>
<li>强制转换(类型)变量名，是对数据值复制的内容进行处理（不会处理实际存储的内容）</li>
<li>settype会直接改变数据本身</li>
</ol>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628132058386.png" srcset="/img/loading2.gif" lazyload></p>
<h4 id="整数类型（int）"><a href="#整数类型（int）" class="headerlink" title="整数类型（int）"></a>整数类型（int）</h4><p>整数类型：保存整数数值（范围限制），4个字节存储数据，最大就是32位：4,294,967,295。</p>
<p>但是在PHP中默认是有符号类型（区分正负数）</p>
<h5 id="定义方式"><a href="#定义方式" class="headerlink" title="定义方式"></a>定义方式</h5><p>十进制定义，二进制定义，八进制定义和十六进制定义</p>
<ul>
<li><p>$a = 120;        //10进制</p>
</li>
<li><p>$a=0b110;    //2进制</p>
</li>
<li><p>$a=0120;        //8进制</p>
</li>
<li><p>$a=0x120;    //16进制</p>
</li>
</ul>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628134037488.png" srcset="/img/loading2.gif" lazyload></p>
<h5 id="PHP-进制转换"><a href="#PHP-进制转换" class="headerlink" title="PHP 进制转换"></a>PHP 进制转换</h5><ul>
<li><p>decbin()：十进制转二进制</p>
</li>
<li><p>decoct()：十进制转八进制</p>
</li>
<li><p>dechex()：十进制转十六进制</p>
</li>
<li><p>bindec()：二进制转十进制</p>
</li>
<li><p>bin2hex()：二进制转十六进制</p>
</li>
</ul>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628140009412.png" srcset="/img/loading2.gif" lazyload></p>
<h4 id="浮点类型（float）"><a href="#浮点类型（float）" class="headerlink" title="浮点类型（float）"></a>浮点类型（float）</h4><p>浮点型：小数类型以及超过整型所能存储范围的整数（不保证精度），精度范围大概在15个有效数字左右</p>
<h5 id="定义方式-1"><a href="#定义方式-1" class="headerlink" title="定义方式"></a>定义方式</h5><p>$f = 1.23;</p>
<p>$f = 1.23e10;    //科学计数法，其中e表示底10</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628140744653.png" srcset="/img/loading2.gif" lazyload alt="image-20210628140744653"></p>
<p>简单说明浮点数为什么同样的字节数存储数据，但是却能表示更大的数据呢？</p>
<p>00000000 00000000 00000000 00000000 -&gt; 11111111 11111111 11111111 1111111 （整形最大值：所有位都是有效数据）</p>
<p>浮点数：加深7位算的结果是10的指数，后面三个字节存储表示具体数值</p>
<p>00000000 00000000 00000000 00000000 -&gt; 1<strong>1111111</strong> 11111111 11111111 1111111</p>
<p>注意：尽量不用用浮点数做精确判断：浮点数保存的数据不够精确，而且在计算机中凡是小数基本上存的都不准确</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628141213736.png" srcset="/img/loading2.gif" lazyload></p>
<h4 id="字符串类型（string）"><a href="#字符串类型（string）" class="headerlink" title="字符串类型（string）"></a>字符串类型（string）</h4><h5 id="字符串定义语法"><a href="#字符串定义语法" class="headerlink" title="字符串定义语法"></a>字符串定义语法</h5><ol>
<li>单引号字符串：使用单引号包裹</li>
<li>双引号字符串：使用双引号包裹</li>
</ol>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210629200559846.png" srcset="/img/loading2.gif" lazyload></p>
<p>引号方式：比较适合定义那些比较短（不超过一行）或者没有结构(缩进等)要求的字符串</p>
<p>如果有结构要求，或者内容超过一行，可以使用以下两种结构定义</p>
<ol>
<li><p>nowdoc 字符串：没有单引号的单引号字符串</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php"><span class="hljs-variable">$str</span> = &lt;&lt;&lt; <span class="hljs-string">&#x27;边界符&#x27;</span><br>    字符串内容<br>边界符;<br></code></pre></div></td></tr></table></figure></li>
<li><p>heredoc 字符串：没有双引号的双引号字符串</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php"><span class="hljs-variable">$str</span> = &lt;&lt;&lt; 边界符<br>    字符串内容<br>边界符;<br><br></code></pre></div></td></tr></table></figure></li>
</ol>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210629203034405.png" srcset="/img/loading2.gif" lazyload></p>
<p>heredoc和nowdoc比引号方式要区别多一点，(查看源码可知保留了结构)</p>
<h5 id="字符串转义"><a href="#字符串转义" class="headerlink" title="字符串转义"></a>字符串转义</h5><p>转义的含义：在计算机通用协议中，有一些特定的方式定义的字母，系统会特定处理：通常这种方式都是使用反斜杠+字母(单词)的特性</p>
<p>\r\n：回车换行</p>
<p>PHP在识别转义字符的时候也是使用同样的模式：反斜杠+字母</p>
<p>在PHP中系统常用的转义符号：</p>
<ul>
<li><p>\‘：在单引号字符串中显示单引号</p>
</li>
<li><p>\“：在双引号字符串中显示双引号</p>
</li>
<li><p>\r：代表回车（理论上是回到当前行的首位置）</p>
</li>
<li><p>\n：代表新一行</p>
</li>
<li><p>\t：类似tab键，输出4个空格</p>
</li>
<li><p>\$：在PHP中使用$符号作为变量符号，因此需要特定识别</p>
</li>
</ul>
<p>单引号和双引号的区别：</p>
<ol>
<li><p>其中单引号中能够识别 \‘，而双引号中就不能识别 \‘（下图浏览器查看的是页面源代码）</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210630232631329.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>双引号中因为能够识别 $ 符号，所以双引号中可以解析变量，而单引号不可以</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210630232709366.png" srcset="/img/loading2.gif" lazyload></p>
</li>
</ol>
<p>双引号中变量识别的规则：</p>
<ol>
<li><p>变量本身系统能够与后面的内容区分：应该保证变量的独立性，不要让系统难以区分</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210630232908494.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>使用变量专业标识符（区分），给变量加上一组大括号 {}</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210630232927534.png" srcset="/img/loading2.gif" lazyload></p>
</li>
</ol>
<p>结构化定义字符串变量的规则：</p>
<ol>
<li><div class="hljs code-wrapper"><pre><code>结构化定义字符串对应的边界符有条件：
</code></pre></div>
</li>
<li>上边界符后面不能跟任何内容(包括空格)；</li>
<li>下边界符必须顶格：最左边；</li>
<li>下边界符同样后面只能跟分号，不能跟任何内容；</li>
<li>结构化定义字符串的内部（边界符之间）的所有内容都是字符串本身</li>
</ol>
<h5 id="字符串长度"><a href="#字符串长度" class="headerlink" title="字符串长度"></a>字符串长度</h5><ol>
<li><p>基本函数 strlen()：得到字符串的长度（字节为单位）</p>
</li>
<li><p>多字节字符串的长度问题：包含中文的长度。</p>
<p>让一个中文的长度为1而不是3</p>
</li>
<li><p>多字节字符串扩展模块：mbstring扩展（mb ：Multi Bytes）</p>
<p>首先需要加载PHP的mbstring扩展</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210708143000403.png" srcset="/img/loading2.gif" lazyload></p>
<p>可以使用mb扩展带来很多函数</p>
<p>mbstring扩展针对的是一些关于字符统计：</p>
<div class="hljs code-wrapper"><pre><code>strlen只是针对标准交换码ASCII

mbstring会针对不同的字符集 (php7默认字符集为utf-8)
</code></pre></div>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210708143343185.png" srcset="/img/loading2.gif" lazyload></p>
</li>
</ol>
<h5 id="字符集相关函数"><a href="#字符集相关函数" class="headerlink" title="字符集相关函数"></a>字符集相关函数</h5><ol>
<li><p>转换函数：implode(), explode(), str_split()</p>
<ul>
<li><p>implode(连接方式,数组)：将数组中的元素按照某个规则连接成一个字符串</p>
</li>
<li><p>explode(分割字符,目标字符串)：将字符串按照某个格式进行分割，变成数组</p>
<div class="hljs code-wrapper"><pre><code>中国|北京|顺义 == array(‘中国’,‘北京’,’顺义’);
</code></pre></div>
</li>
<li><p>str_split(字符串,字符长度)：按照指定长度拆分字符串得到数组</p>
</li>
</ul>
</li>
<li><p>截取函数：trim(), ltrim(), rtrim()</p>
<ul>
<li>trim(字符串[,指定字符])：本身默认是用来去除字符串两边的空格（中间不行），但是也可以指定要去除的内容，是按照指定的内容循环去除两边有的内容：直到碰到一个不是目标字符为止</li>
<li>ltrim()：去除左边的</li>
<li>rtrim()：去除右边的</li>
</ul>
</li>
<li><p>截取函数：substr(), strstr()</p>
<ul>
<li>substr(字符串,起始位置从0开始[,长度])：指定位置开始截取字符串，可以截取指定长度（不指定到最后）</li>
<li>strstr(字符串,匹配字符)：从指定位置开始，截取到最后（可以用来取文件后缀名）</li>
</ul>
</li>
<li><p>大小转换函数：strtolower(), strtoupper(), ucfirst()</p>
<ul>
<li>strtolower：全部小写</li>
<li>strtoupper：全部大写</li>
<li>ucfirst：首字母大写</li>
</ul>
</li>
<li><p>查找函数：strpos(), strrpos()</p>
<ul>
<li>strpos(字符串，匹配字符)：判断字符在目标字符串中出现的位置（首次）</li>
<li>strrpos(字符串，匹配字符)：判断字符在目标字符串中最后出现的位置</li>
</ul>
</li>
<li><p>替换函数：str_replace()</p>
<ul>
<li>str_replace(匹配目标,替换的内容,字符串本身)：将目标字符串中部分字符串进行替换</li>
</ul>
</li>
<li><p>格式化函数：printf(), sprintf()</p>
<ul>
<li>sprintf/sprintf(输出字符串有占位符,顺序占位内容…)：格式化输出数据</li>
</ul>
</li>
<li><p>其他：str_repeat(), str_shuffle()</p>
<ul>
<li>str_repeat()：重复某个字符串N次</li>
<li>str_shuffle()：随机打乱字符串</li>
</ul>
</li>
</ol>
<h4 id="数组（array）"><a href="#数组（array）" class="headerlink" title="数组（array）"></a>数组（array）</h4><h5 id="概念-1"><a href="#概念-1" class="headerlink" title="概念"></a>概念</h5><p>数组：array，数据的组合，指将一组数据（多个）存储到一个指定的容器中，用变量指向该容器，然后可以通过变量一次性得到该容器中的所有数据。</p>
<h5 id="数组定义语法"><a href="#数组定义语法" class="headerlink" title="数组定义语法"></a>数组定义语法</h5><ol>
<li><p>使用array关键字：最常用的</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php">$变量 = <span class="hljs-keyword">array</span>(元素<span class="hljs-number">1</span>,元素<span class="hljs-number">2</span>,元素<span class="hljs-number">3</span>..);<br></code></pre></div></td></tr></table></figure></li>
<li><p>可以使用中括号来包裹数据：</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php">$变量 = [元素<span class="hljs-number">1</span>,元素<span class="hljs-number">2</span>…];<br></code></pre></div></td></tr></table></figure></li>
<li><p>隐形定义数组：给变量增加一个中括号，系统自动变成数组</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php">$变量[] = 值<span class="hljs-number">1</span>;	<span class="hljs-comment">//如果不提供下标也可以，系统自动生成（数字：从0开始）</span><br>$变量[下标] = 值; <span class="hljs-comment">//中括号里面的内容称之为下标key，该下标可以是字母</span><br></code></pre></div></td></tr></table></figure></li>
</ol>
<h5 id="PHP数组特点"><a href="#PHP数组特点" class="headerlink" title="PHP数组特点"></a>PHP数组特点</h5><ol>
<li><p>可以整数下标或者字符串下标 </p>
<ul>
<li><p>如果数组下标都为整数：索引数组</p>
</li>
<li><p>如果数组下标都为字符串：关联数组</p>
</li>
</ul>
</li>
<li><p>不同下标可以混合存在：混合数组</p>
</li>
<li><p>数组元素的顺序以放入顺序为准，跟下标无关</p>
</li>
<li><p>数字下标的自增长特性：从0开始自动增长，如果中间手动出现较大的，那么后面的自增长元素从最大的值+1开始</p>
</li>
<li><p>特殊值下标的自动转换</p>
<div class="hljs code-wrapper"><pre><code>布尔值：true和false
 
空：NULL
</code></pre></div>
</li>
<li><p>PHP中数组元素没有类型限制</p>
</li>
<li><p>PHP中数组元素没有长度限制</p>
</li>
</ol>
<p>补充：PHP中的数组是很大的数据，所以存储位置是堆区，为当前数组分配一块连续的内存。</p>
<h5 id="多维数组"><a href="#多维数组" class="headerlink" title="多维数组"></a>多维数组</h5><p>多维数组：数组里面的元素又是数组</p>
<h6 id="二维数组"><a href="#二维数组" class="headerlink" title="二维数组"></a>二维数组</h6><p>数组中所有的元素都是一维数组</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210708162353057.png" srcset="/img/loading2.gif" lazyload></p>
<h6 id="多维数组-1"><a href="#多维数组-1" class="headerlink" title="多维数组"></a>多维数组</h6><p>在第二维的数组元素中可以继续是数组，在PHP中没有维度限制（PHP本质并没有二维数组）</p>
<p>但是：不建议使用超过三维以上的数组，会增加访问的复杂度，降低访问效率。</p>
<h6 id="异性数组（不规则数组）"><a href="#异性数组（不规则数组）" class="headerlink" title="异性数组（不规则数组）"></a>异性数组（不规则数组）</h6><p>异形数组：数组中的元素不规则，有普通基本变量也有数组。</p>
<p>在实际开发中，并不常用，尽量让数组元素规则化（便于进行访问）</p>
<h5 id="数组遍历"><a href="#数组遍历" class="headerlink" title="数组遍历"></a>数组遍历</h5><h6 id="基本含义"><a href="#基本含义" class="headerlink" title="基本含义"></a>基本含义</h6><p>数组遍历：普通数组数据的访问都是通过数组元素的下标来实现访问，如果说数组中所有的数据都需要依次输出出来，就需要我们使用到一些简化的规则来实现自动获取下标以及输出数组元素。</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php"><span class="hljs-variable">$arr</span> = <span class="hljs-keyword">array</span>(<span class="hljs-number">0</span>=&gt;<span class="hljs-keyword">array</span>(‘name’ =&gt; ‘Tom’),<span class="hljs-number">1</span>=&gt;<span class="hljs-keyword">array</span>(‘name’ =&gt; ‘Jim’));	<span class="hljs-comment">//二维数组</span><br><span class="hljs-comment">//访问一维元素：$arr[一维下标]</span><br><span class="hljs-variable">$arr</span>[<span class="hljs-number">0</span>];	<span class="hljs-comment">//结果：array(‘name’ =&gt; ‘Tom’);</span><br><br><span class="hljs-comment">//访问二维元素：$arr[一维下标][二维下标]</span><br><span class="hljs-variable">$arr</span>[<span class="hljs-number">1</span>][‘name’];	<span class="hljs-comment">//Jim</span><br></code></pre></div></td></tr></table></figure>

<h6 id="foreach遍历语法"><a href="#foreach遍历语法" class="headerlink" title="foreach遍历语法"></a>foreach遍历语法</h6><figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php"><span class="hljs-keyword">foreach</span>($数组变量 <span class="hljs-keyword">as</span> [$下标 =&gt;] $值)&#123;	<span class="hljs-comment">//下标可有可无</span><br>	<span class="hljs-comment">//通过$下标访问元素的下标；通过$值访问元素的值</span><br>&#125;<br></code></pre></div></td></tr></table></figure>

<p>通常：如果是关联数组（字母下标），就需要下标，如果是数字下标就直接访问值</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210708162617986.png" srcset="/img/loading2.gif" lazyload></p>
<p>获取下标</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210708162626190.png" srcset="/img/loading2.gif" lazyload></p>
<p>在进行数据存储定义的时候，通常二维数组不会两个维度的key下标都为数字，一般是一维为数字（无意义），二维为字符串（数据库表字段），所以在进行遍历的时候，通常是只需要针对一维进行遍历，取得二维数组元素，然后二维数组元素通过下标去访问。</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210708162638184.png" srcset="/img/loading2.gif" lazyload></p>
<h6 id="foreach遍历原理"><a href="#foreach遍历原理" class="headerlink" title="foreach遍历原理"></a>foreach遍历原理</h6><p>foreach遍历的原理：本质是数组的内部有一颗指针，默认是指向数组元素的第一个元素，foreach就是利用指针去获取数据，同时移动指针。</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php"><span class="hljs-keyword">foreach</span>(<span class="hljs-variable">$arr</span> <span class="hljs-keyword">as</span> <span class="hljs-variable">$k</span> =&gt; <span class="hljs-variable">$v</span>)&#123;<br>	<span class="hljs-comment">//循环体</span><br>&#125;<br></code></pre></div></td></tr></table></figure>

<ol>
<li>foreach会重置指针：让指针指向第一个元素；</li>
<li>进入foreach循环：通过指针取得当前第一个元素，然后将下标取出放到对应的下标变量$k中（如果存在），将值取出来放到对应的值变量$v中；（指针下移）</li>
<li>进入到循环内部（循环体），开始执行；</li>
<li>重复2和3，直到在2的时候遇到指针取不到内容（指针指向数组最后</li>
</ol>
<h6 id="for循环遍历数组"><a href="#for循环遍历数组" class="headerlink" title="for循环遍历数组"></a>for循环遍历数组</h6><p>for循环：基于已知边界条件（起始和结束）然后有条件的变化(规律,索引数组)</p>
<p>因此：for循环遍历数组有对应条件</p>
<ol>
<li>获取数组长度：count(数组)得到数组元素的长度</li>
<li>要求数组元素的下标是规律的数字</li>
</ol>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210708162816017.png" srcset="/img/loading2.gif" lazyload></p>
<h6 id="while配合each和list遍历数组"><a href="#while配合each和list遍历数组" class="headerlink" title="while配合each和list遍历数组"></a>while配合each和list遍历数组</h6><p>while是在外部定义边界条件，如果要实现可以和for循环一样。</p>
<p>list与each配合特别好：</p>
<ol>
<li> each一定有两个元素就是0和1元素，得到的数组结构正好可以给list使用，然后通过list的(变量1,变量2)得到0和1元素的值，对应的就是原数组的下标和值。</li>
<li>list(变量1,变量2) = each(数组);        //是一种赋值运算，但是可以得到false结果（each取不到正确的结果），整个表达式为false，起到结束循环的效果</li>
</ol>
<h5 id="数组函数"><a href="#数组函数" class="headerlink" title="数组函数"></a>数组函数</h5><h6 id="排序函数"><a href="#排序函数" class="headerlink" title="排序函数"></a>排序函数</h6><ol>
<li>sort()：顺序排序（下标重排，下标和值的关系改变）</li>
<li>rsort()：逆序排序 （同上）</li>
<li>asort()：顺序排序（下标保留，下标和值的对应关系不变）</li>
<li>arsort()：逆序排序 (同上)</li>
<li>ksort()：顺序排序：按照键名（下标）</li>
<li>krsort()：逆序排序：按照键名（下标）</li>
<li>shuffle()：随机打乱数组元素，数组下标会重排</li>
</ol>
<h6 id="指针函数"><a href="#指针函数" class="headerlink" title="指针函数"></a>指针函数</h6><ol>
<li>reset()：重置指针，将数组指针指向首位</li>
<li>end()：重置指针，将数组指针指向最后一个元素</li>
<li>next()：指针下移，取得下一个元素的值</li>
<li>prev()：指针上移，取得上一个元素的值</li>
<li>current()：获取当前指针对应的元素值</li>
<li>key()：获取当前指针对应的下标值</li>
</ol>
<p>注意事项：next和prev会移动指针，有可能导致指针移动到最前或者最后（离开数组），导致数组不能使用，通过next和prev不能回到正确的指针位置。只能通过end或者reset进行指针重置</p>
<h6 id="其他函数"><a href="#其他函数" class="headerlink" title="其他函数"></a>其他函数</h6><ol>
<li>count()：统计数组中元素的数量</li>
<li>array_push()：往数组中加入一个元素（数组最后）</li>
<li>array_pop()：从数组中弹出一个元素并返回（数组最后）</li>
<li>array_shift()：从数组中弹出一个元素并返回（数组开头）</li>
<li>array_unshift()：从数组中加入一个元素（数组开头）</li>
<li>array_reverse()：返回单元顺序相反的数组</li>
<li>in_array()：判断一个元素在数组中是否存在</li>
<li>array_keys()：获取一个数组的所有下标，返回一个索引数组</li>
<li>array_values()：获取一个数组的所有值，返回一个索引数组</li>
</ol>
<h4 id="布尔类型（boolean）"><a href="#布尔类型（boolean）" class="headerlink" title="布尔类型（boolean）"></a>布尔类型（boolean）</h4><p>布尔类型：两个值true和false，通常是用于判断比较</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628141333016.png" srcset="/img/loading2.gif" lazyload alt="image-20210628141333016"></p>
<p>在进行某些数据判断的时候，需要特别注意类型转换</p>
<div class="hljs code-wrapper"><pre><code>empty()：判断数据的值是否为“空”，不是NULL，如果为空返回true，不为空返回false

isset()：判断数据存储的变量本身是否存在，存在变量返回true，不存在返回false
</code></pre></div>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628141717452.png" srcset="/img/loading2.gif" lazyload></p>
<h3 id="运算符"><a href="#运算符" class="headerlink" title="运算符"></a>运算符</h3><p>运算符：operator，是一种将数据进行运算的特殊符号，在PHP中一共有十种运算符之多</p>
<h4 id="赋值运算符"><a href="#赋值运算符" class="headerlink" title="赋值运算符"></a>赋值运算符</h4><p>符号是“=”，表示将右边的结果（可以是变量、数据、常量和其它运算出来的结果），保存到内存的某个位置，然后将位置的内存地址赋值给左侧的变量（常量）。</p>
<h4 id="算数运算符"><a href="#算数运算符" class="headerlink" title="算数运算符"></a>算数运算符</h4><p>算术运算：基本算术操作</p>
<ul>
<li><p>+：执行数据累加</p>
</li>
<li><p>-：数据相减</p>
</li>
<li><p>*：键盘上没有乘法符号，使用*代替，两个数相乘</p>
</li>
<li><p>/：正斜杠代替，表示两个数相除</p>
</li>
<li><p>%：取余(模)运算，两个数（整数）相除，保留余数</p>
</li>
</ul>
<p>注意：在进行除法运算或者取余运算的时候，对应的除数（第二个数）不能为0</p>
<h4 id="比较运算符"><a href="#比较运算符" class="headerlink" title="比较运算符"></a>比较运算符</h4><p>比较运算：比较两个数据的大小，或者两个内容是否相同，返回的结果都是布尔类型：满足返回true，不满足返回false</p>
<ul>
<li><p>&gt;：左边大于右边，返回结果true</p>
</li>
<li><p>&gt;=：左边大于等于右边</p>
</li>
<li><p>&lt;：左边小于右边</p>
</li>
<li><p>&lt;=：左边小于或者等于右边</p>
</li>
<li><p>==：左边的与右边的相同（大小相同）</p>
</li>
<li><p>!=：左边的与右边的不同（大小不同）</p>
</li>
<li><p>===：全等于，左边与右边相同：大小以及数据的类型都要相同</p>
</li>
<li><p>!==：不全等于，只要大小或者类型不同就为true</p>
</li>
</ul>
<h4 id="逻辑运算符"><a href="#逻辑运算符" class="headerlink" title="逻辑运算符"></a>逻辑运算符</h4><p>逻辑运算：针对不同的结果进行匹配。满足条件返回true，不满足返回false</p>
<ul>
<li><p><code>&amp;&amp;</code> 和 <code>and</code> ：逻辑与，左边的条件与右边的条件同时成立（两边结果都为true）</p>
</li>
<li><p><code>||</code> 和 <code>or</code> ：逻辑或，左边的条件或者右边的条件只要有一个满足即可</p>
</li>
<li><p><code>!</code> ：逻辑非，对已有条件进行取反，本身为true，取反结果就是false</p>
</li>
</ul>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628142659903.png" srcset="/img/loading2.gif" lazyload></p>
<p>逻辑与和逻辑或又称之为****短路运算*<em><strong>：如果第一个表达式结果已经满足条件了，那么就不会运行逻辑运算符后面的表达式：</strong>在书写代码的时候，尽量将出现概率最高的（能够直接判断出结果）的表达式放到第一位，提高运算效率</em>*</p>
<h4 id="连接运算符"><a href="#连接运算符" class="headerlink" title="连接运算符"></a>连接运算符</h4><p>是 PHP 中将多个字符串拼接的一种符号</p>
<ul>
<li><code>.</code> ：将两个字符串连接到一起</li>
<li><code>.=</code> ： 复合运算，将左边的内容与右边的内容连接起来，然后重新赋值给左边变量</li>
</ul>
<p>A .= b  ⇔  A = A . b</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628143257603.png" srcset="/img/loading2.gif" lazyload></p>
<h4 id="错误抑制符"><a href="#错误抑制符" class="headerlink" title="错误抑制符"></a>错误抑制符</h4><p>在PHP中有一些错误可以提前预知，但是这些错误可能无法避免，但是又不希望报错给用户看，可以使用错误抑制符处理。</p>
<div class="hljs code-wrapper"><pre><code>`@` ：在可能出错的表达式前面使用@符号即可
</code></pre></div>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628143553218.png" srcset="/img/loading2.gif" lazyload></p>
<p>错误抑制符通常在生产环境（上线）会用到，在开发的时候不会用：系统本身最好没有任何错误。</p>
<h4 id="三目运算符"><a href="#三目运算符" class="headerlink" title="三目运算符"></a>三目运算符</h4><p>三目运算：有三个表达式参与的运算（简单的的分支结构缩写）</p>
<p>语法格式：</p>
<p><code>表达式1 ? 表达式2 : 表达式3;</code> </p>
<p>运算：如果表达式1成立，那么执行表达式2，否则执行表达式3；</p>
<p>注意：如果表达式本身比较复杂，建议使用括号包起来。</p>
<p>三目运算可以进行复合三目运算：三目运算中的表达式2和3都是可以是另外一个三目运算。</p>
<p><code>表达式1 ? (表达式2 ? 表达式4 : 表达式5) : (表达式3 ? 表达式6 : 表达式7);</code> </p>
<h4 id="自操作运算符"><a href="#自操作运算符" class="headerlink" title="自操作运算符"></a>自操作运算符</h4><p>自操作：自己操作自己的运算符</p>
<ul>
<li><p><code>++</code> ：在原来的值上+1</p>
</li>
<li><p><code>--</code> ：在原来的值上-1</p>
</li>
</ul>
<p>在PHP中自操作符是可以放到变量前或者后：前置自操作和后置自操作</p>
<ul>
<li><p>后置自操作：先把自己所保存的值留下来，然后改变自己，自己给别人的值是原来的值；</p>
</li>
<li><p>前置自操作：先把自己改变，然后把改变后的值给别人。</p>
</li>
</ul>
<p>衍生符号：类似自操作</p>
<ul>
<li><p><code>+=</code> ：左边的结果与右边结果相加，然后赋值给左边</p>
</li>
<li><p><code>-=</code> ：左边的减去右边的结果，然后复制给左边</p>
</li>
<li><p><code>*=</code> ：乘法操作</p>
</li>
<li><p><code>/=</code> ：除法操作</p>
</li>
<li><p><code>%=</code> ：模操作</p>
</li>
</ul>
<p>注意：右边是一个整体     $a += $b;  ⇔  $a = $a + ($b);</p>
<p>如果进行除法或者取余运算，那么要考虑右边表达式的结果是否为0（为0出错）</p>
<h4 id="位运算符"><a href="#位运算符" class="headerlink" title="位运算符"></a>位运算符</h4><h5 id="计算机码"><a href="#计算机码" class="headerlink" title="计算机码"></a>计算机码</h5><p>计算机在实际存储数据的时候，采用的编码规则（二进制规则）</p>
<p>计算机码：原码、反码和补码。数值本身最左边一位是用来充当符号位：正0负1</p>
<ul>
<li><p>原码：数据本身从十进制转换成二进制得到的结果</p>
<p>正数：左边符号位为0（正数的原码、反码和补码就是原码本身）<br>负数：左边符号位为1</p>
</li>
<li><p>反码：针对负数，符号位不变，其他位取反</p>
</li>
<li><p>补码：针对负数，反码+1</p>
</li>
</ul>
<p>系统中存在两个0：+0和-0 (0的原码跟反码都有两个，因为这里0被分为+0和-0)</p>
<div class="hljs code-wrapper"><pre><code>+0： 00000000

-0 ： 10000000    原码
</code></pre></div>
<ul>
<li>取反 11111111</li>
<li>补码 00000000</li>
</ul>
<h5 id="位运算"><a href="#位运算" class="headerlink" title="位运算"></a>位运算</h5><p>位运算：取出计算机中最小的单位（位bit）进行运算</p>
<ul>
<li>&amp;：按位与，两个位都为1，结果为1，否则为0</li>
</ul>
<ol>
<li><p>|：按位或，两个有一个为1，结果为1</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628151029489.png" srcset="/img/loading2.gif" lazyload></p>
<p>注意：</p>
<ol>
<li><p>系统进行任何位运算的时候都是使用的补码。</p>
<p>–计算机存储的是补码(为了实现化减为加–用加法处理减法)。用-5作为位运算时，-5在计算机内的二进制表示是二进制补码。</p>
</li>
<li><p>运算结束之后都必须转换成原码才是最终要显示的数据</p>
<p>–补码的计算结果依然是补码，但是显示时需要转为原码：符号位为0(正数)的补码=原码 不用转换；符号位为1(负数)的需要把补码转换为原码。</p>
</li>
</ol>
</li>
</ol>
<ul>
<li><p>~：按位非，一个位如果为1则变成0，否则反之</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628151449325.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>^：按位异或，两个相同则为0，不同则为1</p>
</li>
<li><p>&lt;&lt;：按位左移，整个位（32位），向左移动一位，右边补0</p>
</li>
<li><p>&gt;&gt;：按位右移，整个位向右移动一位，左边补符号位对应内容</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628152113926.png" srcset="/img/loading2.gif" lazyload></p>
</li>
</ul>
<p>按位左移：乘以2的操作</p>
<p>按位右移：除以2的操作（不完全正确）：整数除2会出现小数</p>
<h4 id="运算符优先级"><a href="#运算符优先级" class="headerlink" title="运算符优先级"></a>运算符优先级</h4><p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628152259662.png" srcset="/img/loading2.gif" lazyload></p>
<h3 id="流程控制"><a href="#流程控制" class="headerlink" title="流程控制"></a>流程控制</h3><h4 id="控制分类"><a href="#控制分类" class="headerlink" title="控制分类"></a>控制分类</h4><ul>
<li>顺序结构：代码从上往下，顺序执行。（代码执行的最基本结构）</li>
<li>分支结构：给定一个条件，同时有多种可执行代码（块），然后会根据条件执行某一段代码</li>
<li>循环结构：在某个条件控制范围内，指定的代码（块）可以重复执行</li>
</ul>
<h4 id="顺序结构"><a href="#顺序结构" class="headerlink" title="顺序结构"></a>顺序结构</h4><p>最基本结构，所有代码默认都是从上往下依次执行</p>
<h4 id="分支结构"><a href="#分支结构" class="headerlink" title="分支结构"></a>分支结构</h4><p>在PHP中，分支结构主要有两种：if分支 和 switch分支</p>
<h5 id="if-分支"><a href="#if-分支" class="headerlink" title="if 分支"></a>if 分支</h5><ol>
<li><p>最简if：只有一段代码，但是可以选择是否执行</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php"><span class="hljs-keyword">if</span>(条件表达式)&#123;<br>    <span class="hljs-comment">//满足条件所要执行的内容 //顺序结构</span><br>&#125;<br></code></pre></div></td></tr></table></figure></li>
<li><p>基础if：有两面性，满足条件或者不满足条件都有对应的执行代码</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php"><span class="hljs-keyword">if</span>(条件表达式)&#123;<br>    <span class="hljs-comment">//满足条件后执行的代码段;</span><br>&#125;<span class="hljs-keyword">else</span>&#123;<br>    <span class="hljs-comment">//不满足条件执行的代码段;</span><br>&#125;<br></code></pre></div></td></tr></table></figure></li>
<li><p>复杂if结构：在判断条件之后，通常就有两种结果：满足或者不满足，在不满足之后还可以再次进行条件判断</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php"><span class="hljs-keyword">if</span>(条件表达式<span class="hljs-number">1</span>)&#123;<br>    <span class="hljs-comment">//满足条件表达式1的代码段;</span><br>&#125;<span class="hljs-keyword">elseif</span>(条件表达式<span class="hljs-number">2</span>)&#123;	<span class="hljs-comment">//`else if 分开也可以</span><br>    <span class="hljs-comment">//不满足表达式1条件，但是满足表达式2的代码;</span><br>&#125;…&#123;	<span class="hljs-comment">//可以使用多个elseif来进行再次条件筛选</span><br>&#125;<span class="hljs-keyword">else</span>&#123;<br>    <span class="hljs-comment">//全部不满足要执行的代码;</span><br>&#125;<br></code></pre></div></td></tr></table></figure></li>
</ol>
<h5 id="switch-分支"><a href="#switch-分支" class="headerlink" title="switch 分支"></a>switch 分支</h5><p>switch分支：有一组情形存在，同过一条件，通常有多个值，但是每一个值都会有对应不同的代码要执行。</p>
<p>switch判断方式：是将条件放到分支结构内部判断。</p>
<p>switch基本语法：</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php"><span class="hljs-keyword">switch</span>(条件表达式)&#123;<br>	<span class="hljs-comment">//所有条件判断：逐个进行</span><br>    <span class="hljs-keyword">case</span> 值<span class="hljs-number">1</span>:	<span class="hljs-comment">//当前条件表达式的结果与值1相等（==）</span><br>        要执行的代码段;<br>        <span class="hljs-keyword">break</span>;	<span class="hljs-comment">//在switch中，如果条件匹配成功，那么系统就不会再次匹配条件，会自动顺序执行向下的所有代码（case代码除外），需要中断执行：break表示中断switch（结束）。</span><br>    <span class="hljs-keyword">case</span> 值<span class="hljs-number">2</span>:<br>        要执行的代码段;<br>        <span class="hljs-keyword">break</span>;<br>    <span class="hljs-comment">//可以使用类似else的语法：都不匹配</span><br>	<span class="hljs-keyword">default</span>:<br>        <span class="hljs-comment">//匹配失败的代码;</span><br>        <span class="hljs-keyword">break</span>;<br>&#125;<br></code></pre></div></td></tr></table></figure>

<p>if 和 switch 的选择</p>
<ol>
<li>if能做所有的分支结构事情</li>
<li>switch处理的是条件比较多，同时比较单一，而且是固定值匹配的分支结构</li>
</ol>
<h4 id="循环结构"><a href="#循环结构" class="headerlink" title="循环结构"></a>循环结构</h4><p>代码段在一定的控制下，可以多次执行。</p>
<p>在PHP中循环结构有以下几种：</p>
<h5 id="for循环"><a href="#for循环" class="headerlink" title="for循环"></a>for循环</h5><p>通过条件、起始和终止判断执行</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php"><span class="hljs-keyword">for</span>(条件表达式<span class="hljs-number">1</span>;条件表达式<span class="hljs-number">2</span>;条件表达式<span class="hljs-number">3</span>)&#123;<br>    <span class="hljs-comment">//条件表达式1：定义初始化条件，可以有多种赋值语句存在，使用逗号分隔即可</span><br>    <span class="hljs-comment">//条件表达式2：边界判定，限定循环执行的次数</span><br>    <span class="hljs-comment">//条件表达式3：用来执行条件变化（自操作）</span><br>    <span class="hljs-comment">//循环体</span><br>&#125;<br></code></pre></div></td></tr></table></figure>

<p>for循环执行原理：</p>
<ol>
<li>执行条件表达式1：定义初始化条件（执行一次）</li>
<li>执行条件表达式2：判断条件（N次）<ol>
<li>满足条件：执行循环体</li>
<li>不满足条件：循环结束</li>
</ol>
</li>
<li>执行循环体：（N次）</li>
<li>执行条件表达式3：循环变量变化（N次）</li>
<li>执行条件表达式2：判断条件（N次）</li>
<li>重复执行3-4-2步骤：直到第2步不满足条件结束循环</li>
</ol>
<p>for循环特殊使用：for循环中对应的括号（条件）可以一个都没有（死循环）但一定要避免出现；</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php"><span class="hljs-keyword">for</span>(;;)&#123;<br>    <span class="hljs-comment">//循环体</span><br>&#125;<br></code></pre></div></td></tr></table></figure>

<h5 id="while循环"><a href="#while循环" class="headerlink" title="while循环"></a>while循环</h5><p>通过判断条件终止</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php">条件初始化;<br><span class="hljs-keyword">while</span>(条件表达式)&#123;<br>    <span class="hljs-comment">//条件表达式就是判断边界条件</span><br>    循环体;		<span class="hljs-comment">//循环条件的变化</span><br>&#125;<br></code></pre></div></td></tr></table></figure>

<p>For与while的选择</p>
<ol>
<li>如果是基于固定已知条件（数值而且是有规律的变化），使用for循环</li>
<li>while可以做灵活的条件判定（while使用的比较多）</li>
</ol>
<h5 id="do-while循环"><a href="#do-while循环" class="headerlink" title="do-while循环"></a>do-while循环</h5><figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php"><span class="hljs-keyword">do</span>&#123;<br>    <span class="hljs-comment">//循环体</span><br>&#125;<span class="hljs-keyword">while</span>(条件表达式);<br></code></pre></div></td></tr></table></figure>

<h5 id="foreach循环"><a href="#foreach循环" class="headerlink" title="foreach循环"></a>foreach循环</h5><p>专门针对数组</p>
<h5 id="循环控制"><a href="#循环控制" class="headerlink" title="循环控制"></a>循环控制</h5><p>循环控制：在循环内部对循环本身进行控制</p>
<ul>
<li><p>中断控制：重新开始循环，循环体中还有其他内容，也不执行，重新执行</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php"><span class="hljs-keyword">continue</span> 层级;	<span class="hljs-comment">//层级默认是1（循环可以多层嵌套）</span><br></code></pre></div></td></tr></table></figure></li>
<li><p>终止控制：循环直接结束</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php"><span class="hljs-keyword">break</span> 层级;		<span class="hljs-comment">//层级默认是1</span><br></code></pre></div></td></tr></table></figure></li>
</ul>
<h4 id="流程控制替代语法"><a href="#流程控制替代语法" class="headerlink" title="流程控制替代语法"></a>流程控制替代语法</h4><p>流程控制替代语法：分支和循环结构的替代语法</p>
<p>PHP本身是嵌入到HTML中的脚本语言，需要在HTML中书写一些关于判断或者循环的结构语法，必须符合PHP标签规范，需要HTML与PHP进行混搭，如果使用原始的PHP代码那么会非常不美观。</p>
<p>例子： 九九乘法表</p>
<figure class="highlight plaintext"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php+HTML">&lt;table border=&quot;1&quot;&gt;<br>    &lt;?php for ($i = 1; $i &lt; 10; $i++) &#123; ?&gt;<br>    &lt;tr&gt;<br>        &lt;?php for ($j = 1; $j &lt;= $i; $j++) &#123; ?&gt;<br>        &lt;td&gt;<br>            &lt;?php echo $i . &#x27; * &#x27; . $j . &#x27; = &#x27; . $i * $j ?&gt;<br>        &lt;/td&gt;<br>        &lt;?php &#125; ?&gt;<br>    &lt;/tr&gt;<br>    &lt;?php &#125; ?&gt;<br>&lt;/table&gt;<br></code></pre></div></td></tr></table></figure>

<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628160755681.png" srcset="/img/loading2.gif" lazyload></p>
<p>在PHP书写到HTML中的这些大括号{}非常不美观，所以PHP提供了一种替代机制，让其可以不用书写大括号：</p>
<ul>
<li>For(;;){  –&gt;  for(;;):</li>
<li>}            –&gt;  endfor;</li>
</ul>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628161032944.png" srcset="/img/loading2.gif" lazyload></p>
<p>PHP中具体有哪些替代语法呢？</p>
<p>PHP应该在HTML中只做数据输出，输出通常伴有条件判断和循环操作，因此PHP提供了对应分支结构和循环结构的替代语法：全部都是对应的一个模式：</p>
<ul>
<li>左大括号 <code>&#123;</code> 使用 <code>:</code> 替代：</li>
<li>右大括号 <code>&#125;</code> 使用 <code>end+对应的起始标记</code> 替代</li>
</ul>
<table>
<thead>
<tr>
<th>标记</th>
<th>起始</th>
<th>结束</th>
</tr>
</thead>
<tbody><tr>
<td>if</td>
<td>if() :</td>
<td>endif;</td>
</tr>
<tr>
<td>switch</td>
<td>switch() :</td>
<td>endswitch;</td>
</tr>
<tr>
<td>for</td>
<td>for(;;) :</td>
<td>endfor;</td>
</tr>
<tr>
<td>while</td>
<td>while() :</td>
<td>endwhile;</td>
</tr>
<tr>
<td>foreach</td>
<td></td>
<td></td>
</tr>
</tbody></table>
<h3 id="文件包含"><a href="#文件包含" class="headerlink" title="文件包含"></a>文件包含</h3><p>在一个PHP脚本中，去将另外一个文件（PHP）包含进来，去合作完成一件事情。</p>
<h4 id="作用"><a href="#作用" class="headerlink" title="作用"></a>作用</h4><p>文件包含的意义：</p>
<ol>
<li><p>要么使用被包含文件中的内容，实现代码的共享（重用）：向上包含（索要）</p>
<p>向上包含：在当前脚本要用某个代码之前包含别的文件</p>
</li>
<li><p>要么自己有东西可以给别的文件使用，实现代码的共享（重用）：向下包含（给予）</p>
<p>向下包含：在自己有某个东西的时候，需要别的脚本来显示（自己代码写完之后包含其他文件）</p>
</li>
</ol>
<p>最大的作用：<strong>分工协作</strong>，每个脚本做的事情不一样，因此可以使用协作方式，让多个脚本共同完成一件事情。</p>
<h4 id="文件包含四种形式"><a href="#文件包含四种形式" class="headerlink" title="文件包含四种形式"></a>文件包含四种形式</h4><p>在PHP中文件的包含有四种形式（两种大形式）：</p>
<ul>
<li><p>Include：包含文件</p>
</li>
<li><p>Include_once：系统会自动判断文件包含过程中，是否已经包含过（一个文件最多被包含一次）</p>
</li>
<li><p>Require：与include相同</p>
</li>
<li><p>Require_once：与include_once相同</p>
</li>
</ul>
<p>包含基本语法</p>
<ul>
<li><p>Include ‘文件名字’;</p>
</li>
<li><p>Include(‘文件名字’);    //文件名字：路径问题</p>
</li>
</ul>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628163927572.png" srcset="/img/loading2.gif" lazyload alt="image-20210628163927572"></p>
<p>以上方式：是先包含文件，后使用文件中的内容（向上包含）</p>
<p>向下包含：先准备内容，然后包含另外的文件，在另外的文件中，使用当前的内容</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628164455678.png" srcset="/img/loading2.gif" lazyload></p>
<h4 id="文件加载原理"><a href="#文件加载原理" class="headerlink" title="文件加载原理"></a>文件加载原理</h4><p>PHP代码的执行流程：</p>
<ol>
<li>读取代码文件（PHP 程序）</li>
<li>编译：将PHP代码转换成字节码（生成 opcode）</li>
<li>zendengine 引擎来解析 opcode，按照字节码去进行逻辑运算</li>
<li>转换成对应的 HTML 代码</li>
</ol>
<p>文件加载原理：</p>
<ol>
<li><p>在文件加载（include或者require）的时候，系统会自动的将被包含文件中的代码相当于嵌入到当前文件中</p>
</li>
<li><p>加载位置：在哪加载，对应的文件中的代码嵌入的位置就是对应的include位置</p>
</li>
<li><p>在PHP中被包含的文件是单独进行编译的</p>
<p>PHP文件在编译的过程中如果出现了语法错误，那么会失败（不会执行）；但是如果被包含文件有错误的时候，系统会在执行到包含include这条语句的时候才会报错。</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628165803659.png" srcset="/img/loading2.gif" lazyload></p>
</li>
</ol>
<h4 id="include-和-requist-的区别"><a href="#include-和-requist-的区别" class="headerlink" title="include 和 requist 的区别"></a>include 和 requist 的区别</h4><p>Include和include_once的区别：</p>
<ul>
<li><p>Include系统会碰到一次，执行一次；如果对统一个文件进行多次加载，那么系统会执行多次；</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628170242685.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>Include_once：系统碰到多次，也只会执行一次。</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628170333116.png" srcset="/img/loading2.gif" lazyload></p>
</li>
</ul>
<p>Require和include的区别：本质都是包含文件，唯一的区别在于包含不到文件的时候，报错的形式不一样</p>
<ul>
<li><p>include的错误级别比较轻：不会阻止代码执行</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628170614796.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>require要求较高：如果包含出错代码不再执行（require后面的代码）</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628170729389.png" srcset="/img/loading2.gif" lazyload></p>
</li>
</ul>
<h4 id="文件加载路径"><a href="#文件加载路径" class="headerlink" title="文件加载路径"></a>文件加载路径</h4><p>文件在加载的时候需要指定文件路径才能保证PHP正确的找到对应的文件。</p>
<p>文件的加载路径包含两大类：</p>
<ol>
<li><p>绝对路径</p>
<ol>
<li><p>从磁盘的根目录开始（本地绝对路径）</p>
<ul>
<li>Windows：盘符C:/路径/PHP文件</li>
<li>Linux：/路径/PHP文件</li>
</ul>
</li>
<li><p>从网站根目录开始（网络绝对路径）</p>
<ul>
<li><p>/ ：相对于网站主机名字对应的路径</p>
<p>Localhost/index.php -&gt; E:/server/apache/htdocs/index.php</p>
</li>
</ul>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628172146092.png" srcset="/img/loading2.gif" lazyload></p>
</li>
</ol>
</li>
<li><p>相对路径：从当前文件所在目录开始的路径</p>
<ul>
<li><code>.</code> 或 <code>./</code> ：表示当前文件夹</li>
<li><code>../</code> ：上级目录（当前文件夹的上一层文件夹）</li>
</ul>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628172039596.png" srcset="/img/loading2.gif" lazyload></p>
</li>
</ol>
<p>绝对路径和相对路径的加载区别：</p>
<ol>
<li>绝对路径相对效率偏低，但是相对安全（路径不会出问题）</li>
<li>相对路径相对效率高些，但是容易出错（相对路径会发生改变）</li>
</ol>
<h4 id="文件嵌套包含"><a href="#文件嵌套包含" class="headerlink" title="文件嵌套包含"></a>文件嵌套包含</h4><p>文件嵌套包含：一个文件包含另外一个文件，同时被包含的文件又包含了另外一个文件。</p>
<p>嵌套包含的时候就很容易出现相对路径出错的问题：相对路径会因为文件的包含而改变（./和../），原因：windows下面，每一个文件夹下都有.和..的文件夹。</p>
<h3 id="函数"><a href="#函数" class="headerlink" title="函数"></a>函数</h3><p>function，是一种语法结构，将实现某一个功能的代码块（多行代码）封装到一个结构中，从而实现代码的重复利用（复用）。</p>
<h4 id="定义语法"><a href="#定义语法" class="headerlink" title="定义语法"></a>定义语法</h4><p>函数有几个对应的关键点：function关键字、函数名、参数（形参和实参）、函数体和返回值</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php"><span class="hljs-function"><span class="hljs-keyword">function</span> 函数名(<span class="hljs-params">[参数]</span>)</span>&#123;<br>    <span class="hljs-comment">//函数体</span><br>    <span class="hljs-comment">//返回值：return 结果;</span><br>&#125;<br></code></pre></div></td></tr></table></figure>

<p>定义函数的目的：是为了实现代码的重复利用，一个功能一个函数（简单明了）</p>
<p>函数的使用：<code>函数名();</code>    //如果函数在定义的过程中有参数，那么在调用的时候就必须传入对应的参数：函数是一种结构不会自动运行，必须通过调用才会执行</p>
<p>函数的调用特点：只要系统在内存中能够找到对应的函数，就可以执行（函数的调用可以在函数定义之前）</p>
<p>函数执行的内存分析：</p>
<ol>
<li>读取代码进入到代码段（编译：将代码变成字节码存储到内存）。此时function已经在内存里</li>
<li>根据代码逐行执行</li>
</ol>
<h4 id="命名规范"><a href="#命名规范" class="headerlink" title="命名规范"></a>命名规范</h4><p>命名规范：由字母、数字和下划线组成，但是不能以数字开头</p>
<ol>
<li>驼峰法：除了左边第一个单词外，后面所有的单词首字母都大写：showParentInfo()</li>
<li>下划线法：单词之间通过下划线连接，单词都是小写：show_parent_info()</li>
</ol>
<p>函数名字：在一个脚本周期中，不允许出现同名函数（通常在一个系统开发中都不会使用同名函数）</p>
<h4 id="参数"><a href="#参数" class="headerlink" title="参数"></a>参数</h4><p>函数的参数分为两种：形参和实参</p>
<p><strong>形参</strong>：形式参数，不具有实际意义的参数，是在函数定义时使用的参数</p>
<p><strong>实参</strong>：实际参数，具有实际数据意义的参数，是在函数调用时使用的参数</p>
<p>形参是实参的载体：实参在调用时通常是需要传入到函数内部参与计算（运算），那么需要在函数内部去找到实际数据所在的位置才能找到数据本身：需要实际调用的时候，将数据以实参的形式传递给形参：给形参赋值，从而使得函数内部可以用到外部数据。</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628173503789.png" srcset="/img/loading2.gif" lazyload></p>
<p>注意：</p>
<ol>
<li><p>在PHP中允许实参多余形参（个数）：函数内部不用而已</p>
</li>
<li><p>在PHP中理论上形参个数没有限制（实际开发不会太多）</p>
</li>
<li><p>实参不能少于形参个数</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628173519627.png" srcset="/img/loading2.gif" lazyload></p>
</li>
</ol>
<h5 id="默认值"><a href="#默认值" class="headerlink" title="默认值"></a>默认值</h5><p>default value，指的是形参的默认值</p>
<p>在函数定义的时候，就给形参进行一个初始赋值：如果实际调用传入的参数（实参）没有提供，那么形参就会使用定义时的值来进入函数内部参与运算。</p>
<p>通常默认值是用在一些，一定会有某个数据参与，但是可能通常是某个我们知道的值。</p>
<p>注意事项：</p>
<ol>
<li>默认值的定义是放在最右边的，不能左边形参有默认值，但是右边没有</li>
<li>函数外部定义的变量名字与函数定义的形参名字冲突（同名）是没有任何关联关系的；如果多个函数使用同样的形参名字也不冲突</li>
</ol>
<h5 id="引用传递"><a href="#引用传递" class="headerlink" title="引用传递"></a>引用传递</h5><p>引用传值注意事项：在传入实参的时候，必须传入变量</p>
<h4 id="函数体"><a href="#函数体" class="headerlink" title="函数体"></a>函数体</h4><p>函数内部（大括号{}里面）的所有代码都称之为函数体</p>
<p>基本上所有的代码都可以实现</p>
<ol>
<li>定义变量</li>
<li>定义常量</li>
<li>使用流程控制（分支、循环）</li>
<li>可以调用函数</li>
</ol>
<h4 id="函数返回值"><a href="#函数返回值" class="headerlink" title="函数返回值"></a>函数返回值</h4><p>return，指的是将函数实现的结果，通过 return 关键字，返回给函数外部（函数调用处）：在 PHP 中所有的函数都有返回值。（如果没有明确 return 使用，那么系统默认返回 NULL）</p>
<p>返回值作用：将计算结果返回给调用处</p>
<p>注意：函数的返回值可以是任意数据类型</p>
<p>return 关键字：</p>
<ol>
<li><p>return在函数内部存在的价值：返回当前函数的结果、结束当前函数运行</p>
</li>
<li><p>return还可以在文件中直接使用（不在函数里面）：代表文件将结果return后面跟的内容，转交给包含当前文件的位置。（通常在系统配置文件中使用较多），在文件中也代表中终止文件后面的代码：return之后的内容不会执行。</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628174307294.png" srcset="/img/loading2.gif" lazyload></p>
</li>
</ol>
<h4 id="作用域"><a href="#作用域" class="headerlink" title="作用域"></a>作用域</h4><p>变量（常量）能够被访问的区域</p>
<ol>
<li>变量可以在普通代码中定义</li>
<li>变量也可以在函数内部定义</li>
</ol>
<p>在PHP中作用域严格来说分为两种，但是PHP内部还定义一些在严格意义之外的一种，所以总共算三种：</p>
<ol>
<li><p>全局变量：就是用户普通定义的变量（函数外部定义）</p>
<p>所属全局空间：在PHP中只允许在全局空间使用：<strong>理论上函数内部不可访问</strong>（与 js 不同）</p>
<p>脚本周期：直到脚本运行结束（最后一行代码执行完）</p>
</li>
<li><p>局部变量：就是在函数内部定义的变量</p>
<p>所属当前函数空间：在PHP中只允许在当前函数自己内部使用</p>
<p>函数周期：函数执行结束（函数是在栈区中开辟独立内存空间运行）</p>
</li>
<li><p>超全局变量：系统定义的变量（预定义变量：$_SERVER、$_POST等）</p>
<p>所属超全局空间：没有访问限制（函数内外都可以访问）</p>
</li>
</ol>
<p>超全局变量会将全局变量自动纳入到 $GLOBALS 里面，而 $GLOBALS 没有作用域限制，所以能够帮助局部去访问全局变量：但是必须使用数组方式</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628174933758.png" srcset="/img/loading2.gif" lazyload></p>
<p>除了$GLOBALS之外，通过参数传值（如果要同步变化还可以使用引用传值）</p>
<p>在PHP中，其实还有一种方式，能够实现全局访问局部，同时局部也可以访问全局：<strong>global关键字</strong> </p>
<p>global关键字：是一种在函数里面定义变量的一种方式</p>
<ol>
<li>如果使用global定义的变量名在外部存在（全局变量），那么系统在函数内部定义的变量直接指向外部全局变量所指向的内存空间（等同于一个变量）；</li>
<li>如果使用global定义的变量名在外部不存在（全局变量），系统会自动在全局空间（外部）定义一个与局部变量同名的全局变量</li>
</ol>
<p>本质的形式：在函数的内部和外部，对一个同名变量（全局和局部）使用同一块内存地址保存数据，从而实现共同拥有。</p>
<p>基本语法：</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php"><span class="hljs-keyword">global</span> 变量名;	 <span class="hljs-comment">// 不能赋值</span><br>变量名 = 值;	<span class="hljs-comment">//修改</span><br></code></pre></div></td></tr></table></figure>

<p>虽然以上方式可以实现局部与全局的互访，但是通常不会这么用。一般如果会存在特殊使用，也会使用参数的形式来访问（还可以使用常量：define定义的）。</p>
<h4 id="静态变量"><a href="#静态变量" class="headerlink" title="静态变量"></a>静态变量</h4><p>static，是在函数内部定义的变量，使用static关键字修饰，用来实现跨函数共享数据的变量：函数运行结束所有局部变量都会清空，如果重新运行一下函数，所有的局部变量又会重新初始化。</p>
<p>基本语法：</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php"><span class="hljs-function"><span class="hljs-keyword">function</span> 函数名(<span class="hljs-params"></span>)</span>&#123;<br>    <span class="hljs-comment">//定义变量</span><br>    <span class="hljs-built_in">static</span> $变量名 = 值;	<span class="hljs-comment">//通常会在定义的时候就直接赋值</span><br>&#125;<br></code></pre></div></td></tr></table></figure>

<p>静态变量的作用是为了跨函数共享数据（同一个函数被多次调用）</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628180343510.png" srcset="/img/loading2.gif" lazyload></p>
<p>函数在调用的时候，会自动跳过static关键字这一行：(即不再执行重新赋值为1)</p>
<p>静态变量的使用：</p>
<ol>
<li>为了统计：当前函数被调用的次数</li>
<li>为了统筹函数多次调用得到的不同结果（递归思想）</li>
</ol>
<h4 id="可变函数"><a href="#可变函数" class="headerlink" title="可变函数"></a>可变函数</h4><p>当前有一个变量所保存到值，刚好是一个函数的名字，那么就可以使用<code>变量()</code> 来充当函数名使用</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php">$变量 = ‘display’;<br><span class="hljs-function"><span class="hljs-keyword">Function</span> <span class="hljs-title">display</span>(<span class="hljs-params"></span>)</span>&#123;<br>&#125;<br><span class="hljs-comment">//可变函数</span><br>$变量(); <span class="hljs-comment">// 等价于 display();</span><br></code></pre></div></td></tr></table></figure>

<p>可变函数在系统使用的过程中还是比较多的，尤其是使用很多系统函数的时候：需要用户在外部定义一个自定义函数，但是是需要传入到系统函数内部使用。</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628181551870.png" srcset="/img/loading2.gif" lazyload></p>
<h4 id="匿名函数"><a href="#匿名函数" class="headerlink" title="匿名函数"></a>匿名函数</h4><h5 id="基本概念-1"><a href="#基本概念-1" class="headerlink" title="基本概念"></a>基本概念</h5><p>匿名函数：没有名字的函数</p>
<p>基本语法：</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php">变量名 = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>&#123;<br>    函数体<br>&#125;;<br></code></pre></div></td></tr></table></figure>

<p>变量保存匿名函数，本质得到的是一个对象（Closure）</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628224942148.png" srcset="/img/loading2.gif" lazyload></p>
<h5 id="闭包"><a href="#闭包" class="headerlink" title="闭包"></a>闭包</h5><p>closure，一词来源于以下两者的结合：要执行的代码块（由于自由变量被包含在代码块中，这些自由变量以及它们引用的对象没有被释放）和为自由变量提供绑定的计算环境（作用域）</p>
<p>简单理解：函数内部有一些局部变量（要执行的代码块）在函数执行之后没有被释放，是因为在函数内部还有对应的函数在引用（就是函数的内部函数：匿名函数）</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628225513934.png" srcset="/img/loading2.gif" lazyload></p>
<p>证明：函数的局部变量在函数使用完之后没有被释放？</p>
<ol>
<li>使用内部匿名函数；</li>
<li>匿名函数使用局部变量：use；</li>
<li>匿名函数被返回给外部使用；</li>
</ol>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628225901656.png" srcset="/img/loading2.gif" lazyload></p>
<h4 id="伪类型"><a href="#伪类型" class="headerlink" title="伪类型"></a>伪类型</h4><p>假类型，实际上在PHP中不存在的类型。但是通过伪类型可以帮助程序员去更好的查看操作手册从而更方便学习。</p>
<p>伪类型主要有两种：在三大类八小类之外</p>
<ol>
<li>Mixed：混合的，可以是多种PHP中的数据类型</li>
<li>Number：数值的，可以是任意数值类型（整形和浮点型）</li>
</ol>
<h4 id="常用系统函数"><a href="#常用系统函数" class="headerlink" title="常用系统函数"></a>常用系统函数</h4><h5 id="有关输出的函数"><a href="#有关输出的函数" class="headerlink" title="有关输出的函数"></a>有关输出的函数</h5><ul>
<li><p>print()：类似于 echo 输出提供的内容，本质是一种结构（不是函数），返回1，可以不需要使用括号(因为是结构不是函数)</p>
</li>
<li><p>print_r()：类似于var_dump，但是比var_dump简单，不会输出数据的类型，只会输出值（数组打印使用比较多）</p>
</li>
</ul>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628231543632.png" srcset="/img/loading2.gif" lazyload></p>
<h5 id="有关时间的函数"><a href="#有关时间的函数" class="headerlink" title="有关时间的函数"></a>有关时间的函数</h5><ul>
<li>date()：按照指定格式对对应的时间戳（从1970年格林威治时间开始计算的秒数）转换成对应的格式，如果没有指定特定的时间戳，那么就是默认解释当前时间戳</li>
</ul>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628231813625.png" srcset="/img/loading2.gif" lazyload></p>
<ul>
<li><p>time()：获取当前时间对应的时间戳</p>
</li>
<li><p>microtime()：获取微秒级别的时间</p>
</li>
</ul>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628234013522.png" srcset="/img/loading2.gif" lazyload></p>
<ul>
<li>strtotime()：按照规定格式的字符串转换成时间戳 (中文不行)</li>
</ul>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210628234426704.png" srcset="/img/loading2.gif" lazyload></p>
<h5 id="关于数学的函数"><a href="#关于数学的函数" class="headerlink" title="关于数学的函数"></a>关于数学的函数</h5><ul>
<li><p>max()：指定参数中最大的值</p>
</li>
<li><p>min()：比较两个数中较小的值</p>
</li>
<li><p>rand()：得到一个随机数，指定区间的随机整数</p>
</li>
<li><p>mt_rand()：与rand一样，只是底层结构不一样，效率比rand高（建议使用）</p>
</li>
<li><p>round()：四舍五入</p>
</li>
<li><p>ceil()：向上取整</p>
</li>
<li><p>floor()：向下取整</p>
</li>
<li><p>pow()：求指定数字的指定指数次结果：pow(2,8) == 2^8 == 256</p>
</li>
<li><p>abs()：绝对值</p>
</li>
<li><p>sqrt()：求平方根</p>
</li>
</ul>
<h5 id="有关函数的函数"><a href="#有关函数的函数" class="headerlink" title="有关函数的函数"></a>有关函数的函数</h5><ul>
<li><p>function_exists()：判断指定的函数名字是否在内存中存在（帮助用户不去使用一个不存在的函数，让代码安全性更高）</p>
</li>
<li><p>func_get_arg()：在自定义函数中去获取指定数值对应的参数 – 实参位置</p>
</li>
<li><p>func_get_args()：在自定义函数中获取所有的参数（数组）– 所有实参</p>
</li>
<li><p>func_num_args()：获取当前自定义函数的参数数量 – 实参数量</p>
</li>
</ul>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210629000146909.png" srcset="/img/loading2.gif" lazyload></p>
<h4 id="错误处理"><a href="#错误处理" class="headerlink" title="错误处理"></a>错误处理</h4><p>指的是系统（或者用户）在对某些代码进行执行的时候，发现有错误，就会通过错误处理的形式告知程序员。</p>
<h5 id="错误分类"><a href="#错误分类" class="headerlink" title="错误分类"></a>错误分类</h5><ol>
<li><p>语法错误：语法错误会导致代码在编译过程中不通过，所以代码不会执行（<strong>Parse error</strong>）</p>
</li>
<li><p>运行时错误：代码编译通过，但是代码在执行的过程中会出现一些条件不满足导致的错误（<strong>runtime error</strong>）</p>
</li>
<li><p>逻辑错误：程序员在写代码时不够规范，出现了一些逻辑性的错误，导致代码正常执行，但是得不到想要的结果</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php"><span class="hljs-variable">$a</span> = <span class="hljs-number">10</span>;<br><span class="hljs-keyword">if</span> (<span class="hljs-variable">$a</span> = <span class="hljs-number">1</span>) &#123; <span class="hljs-comment">// 最常见问题：把 == 写成 =</span><br>    <span class="hljs-comment">// 执行代码</span><br>&#125;<br></code></pre></div></td></tr></table></figure></li>
</ol>
<h5 id="错误代号"><a href="#错误代号" class="headerlink" title="错误代号"></a>错误代号</h5><p>所有看到的错误代号在PHP中都被定义成了系统常量（可以直接使用）</p>
<ol>
<li><p>系统错误：</p>
<ul>
<li>E_PARSE ：<strong>Parse error</strong>，编译错误，代码不会执行</li>
<li>E_ERROR ：<strong>Fatal error</strong>，致命错误，会导致代码不能正确继续执行（出错的位置断掉）</li>
<li>E_WARNING ：<strong>Warning</strong>，警告错误，不会影响代码执行，但是可能得到意想不到的结果</li>
<li>E_NOTICE ：<strong>Notice</strong>，通知错误，不会影响代码执行</li>
</ul>
</li>
<li><p>用户错误：</p>
<p>E_USER_ERROR , E_USER_WARNING , E_USER_NOTICE</p>
<p>用户在使用自定义错误触发的时候，会使用到的错误代号（系统不会用到）</p>
</li>
<li><p>其他：</p>
<p>E_ALL，代表着所有的错误（通常在进行错误控制的时候使用比较多），建议在开发过程中（开发环境）使用</p>
</li>
</ol>
<p>所有以E开头的错误常量（代号）其实都是由一个字节存储，<strong>每一种错误占据一个对应的位</strong>(比如0000 0001 表示E_ERROR，0000 0010表示E_WARNING)，如果想进行一些错误的控制，可以使用位运算进行操作</p>
<ul>
<li>排除通知级别 notice ：<code>E_ALL &amp; ~E_NOTICE</code> </li>
<li>只要警告和通知：<code>E_WARNING | E_NOTICE</code> </li>
</ul>
<h5 id="错误触发"><a href="#错误触发" class="headerlink" title="错误触发"></a>错误触发</h5><p>程序运行时触发：系统自动根据错误发生后，对比对应的错误信息，输出给用户：主要针对代码的语法错误和运行时错误。</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210629185803983.png" srcset="/img/loading2.gif" lazyload></p>
<p>人为触发：知道某些逻辑可能会出错，从而使用对应的判断代码来触发响应的错误提示</p>
<p><code>Trigger_error(错误提示)</code>：产生一个用户级别的 error/warning/notice 信息</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210629190645937.png" srcset="/img/loading2.gif" lazyload></p>
<p>可以通过第二个参数进行严格性控制</p>
<ul>
<li>E_USER_ERROR</li>
<li>E_USER_WARNING</li>
<li>E_USER_NOTICE</li>
</ul>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210629190943882.png" srcset="/img/loading2.gif" lazyload></p>
<h5 id="错误显示设置"><a href="#错误显示设置" class="headerlink" title="错误显示设置"></a>错误显示设置</h5><p>错误显示设置：哪些错误该显示，以及该如何显示</p>
<p>在PHP中，其实有两种方式来设置当前脚本的错误处理：</p>
<ol>
<li><p>PHP 的配置文件：全局配置：php.ini 文件</p>
<ul>
<li>display_errors：是否显示错误</li>
<li>error_reporting：显示什么级别的错误</li>
</ul>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210629192249764.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>可以在运行的PHP脚本中去设置：在脚本中定义的配置项级别比配置文件高（通常在开发当中都会在代码中去进行控制和配置）</p>
<p>error_reporting()：设置对应的错误显示级别,没有参数表示获取当前系统错误处理对应的级别</p>
<figure class="highlight php"><table><tr><td class="gutter hljs"><div class="hljs code-wrapper"><pre><span class="line">1</span><br></pre></div></td><td class="code"><div class="hljs code-wrapper"><pre><code class="hljs php">error_reporting(E_ERROR | E_WARNING | E_PARSE);<br></code></pre></div></td></tr></table></figure>

<p>ini_set(‘配置文件中的配置项’,配置值)</p>
<p>ini_set(‘error_reporting’,E_ALL);</p>
<p>ini_set(‘display_errors’,1);</p>
</li>
</ol>
<h5 id="错误日志设置"><a href="#错误日志设置" class="headerlink" title="错误日志设置"></a>错误日志设置</h5><p>在实际生产环境中，不会直接让错误赤裸裸的展示给用户：</p>
<ol>
<li>不友好</li>
<li>不安全：错误会暴露网站很多信息（路径、文件名）</li>
</ol>
<p>所以在生产环境中，一般不显示错误（错误也比较少），但是不可能避免会出现错误（测试的时候不会发现所有的问题），这个时候不希望看到，但是又希望捕捉到可以让后台程序员去修改：需要保存到日志文件中，需要在 PHP 配置文件中或者代码中（ini_set）设置对应 error_log 配置项:</p>
<ol>
<li><p>开启日志功能</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210629193034111.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>指定路径 (指定文件不会自动生成，必须手动创建)</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210629192910558.png" srcset="/img/loading2.gif" lazyload></p>
</li>
</ol>
<h5 id="自定义错误处理"><a href="#自定义错误处理" class="headerlink" title="自定义错误处理"></a>自定义错误处理</h5><p>最简单的错误处理：<code>trigger_errors()</code> 函数，但是该函数不会阻止系统报错</p>
<p>PHP系统提供了一种用户处理错误的机制：用户自定义错误处理函数，然后将该函数增加操系统错误处理的句柄中，然后系统会在碰到错误之后，使用用户定义的错误函数。</p>
<ol>
<li><p>如何将用户自定义的函数放到系统中？</p>
<p><code>set_error_handler()</code> </p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210629193323858.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>自定义错误处理函数，系统有要求</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210629193429192.png" srcset="/img/loading2.gif" lazyload></p>
</li>
</ol>
<p>代码实现：</p>
<ol>
<li><p>自定义错误处理函数：注意参数</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210629194719236.png" srcset="/img/loading2.gif" lazyload></p>
</li>
<li><p>注册自定义函数：修改错误处理机制</p>
<p><img src="/2021/07/29/php%E7%AC%94%E8%AE%B0/image-20210629195100688.png" srcset="/img/loading2.gif" lazyload></p>
<p>当前属于简单自定义模式，如果要复杂，可以在某些影响代码功能的错误发生后，让用户跳转到某个指定界面。</p>
</li>
</ol>
<p>笔记CSDN博客地址：<a target="_blank" rel="noopener" href="https://blog.csdn.net/qq_58163927/article/details/118691660?spm=1001.2014.3001.5502">https://blog.csdn.net/qq_58163927/article/details/118691660?spm=1001.2014.3001.5502</a></p>

            </div>
            <hr>
            <div>
              <div class="post-metas mb-3">
                
                  <div class="post-meta mr-3">
                    <i class="iconfont icon-category"></i>
                    
                      <a class="hover-with-bg" href="/categories/%E5%90%8E%E7%AB%AF/">后端</a>
                    
                  </div>
                
                
                  <div class="post-meta">
                    <i class="iconfont icon-tags"></i>
                    
                      <a class="hover-with-bg" href="/tags/php/">php</a>
                    
                      <a class="hover-with-bg" href="/tags/Apache/">Apache</a>
                    
                      <a class="hover-with-bg" href="/tags/mysql/">mysql</a>
                    
                  </div>
                
              </div>
              
                <p class="note note-warning">
                  
                    本博客所有文章除特别声明外，均为本人原创，转载请注明出处！
                  
                </p>
              
              
                <div class="post-prevnext">
                  <article class="post-prev col-6">
                    
                    
                      <a href="/2021/07/30/TypeScript%E7%AC%94%E8%AE%B0/">
                        <i class="iconfont icon-arrowleft"></i>
                        <span class="hidden-mobile">TypeScript笔记</span>
                        <span class="visible-mobile">上一篇</span>
                      </a>
                    
                  </article>
                  <article class="post-next col-6">
                    
                    
                      <a href="/2021/07/29/npm%E7%AC%94%E8%AE%B0/">
                        <span class="hidden-mobile">npm笔记</span>
                        <span class="visible-mobile">下一篇</span>
                        <i class="iconfont icon-arrowright"></i>
                      </a>
                    
                  </article>
                </div>
              
            </div>

            
          </article>
        </div>
      </div>
    </div>
    
      <div class="d-none d-lg-block col-lg-2 toc-container" id="toc-ctn">
        <div id="toc">
  <p class="toc-header"><i class="iconfont icon-list"></i>&nbsp;目录</p>
  <div class="toc-body" id="toc-body"></div>
</div>

      </div>
    
  </div>
</div>

<!-- Custom -->

  <div class="col-lg-7 mx-auto nopadding-x-md">
    <div class="container custom post-custom mx-auto">
      <img src="/img/agoni.gif" srcset="/img/loading2.gif" lazyload class="rounded mx-auto d-block mt-5" style="width:150px; height:150px;"> <h5 style="text-align: center; margin-top: 1rem;">谢谢您的光临噢！！！</h5> 
    </div>
  </div>


    

    
      <a id="scroll-top-button" href="#" role="button">
        <i class="iconfont icon-arrowup" aria-hidden="true"></i>
      </a>
    

    
      <div class="modal fade" id="modalSearch" tabindex="-1" role="dialog" aria-labelledby="ModalLabel"
     aria-hidden="true">
  <div class="modal-dialog modal-dialog-scrollable modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header text-center">
        <h4 class="modal-title w-100 font-weight-bold">搜索</h4>
        <button type="button" id="local-search-close" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body mx-3">
        <div class="md-form mb-5">
          <input type="text" id="local-search-input" class="form-control validate">
          <label data-error="x" data-success="v"
                 for="local-search-input">关键词</label>
        </div>
        <div class="list-group" id="local-search-result"></div>
      </div>
    </div>
  </div>
</div>
    

    
  </main>

  <footer class="text-center mt-5 py-3">
  <div class="footer-content">
     <span>张宝文</span> <i class="iconfont icon-love"></i> <span>郑佳丽</span>  
	<!--《添加网站运行时间 -->
<br/>

<span id="timeDate">载入天数...</span><span id="times">载入时分秒...</span>
<script>
var now = new Date(); 

function createtime() {
    //此处修改你的建站时间或者网站上线时间
    var grt = new Date('07/28/2021 19:00:00');
    now.setTime(now.getTime() + 250);
    days = (now - grt) / 1000 / 60 / 60 / 24;

    dnum = Math.floor(days);
    hours = (now - grt) / 1000 / 60 / 60 - (24 * dnum);
    hnum = Math.floor(hours);
    if (String(hnum).length == 1) {
        hnum = "0" + hnum;
    }
    minutes = (now - grt) / 1000 / 60 - (24 * 60 * dnum) - (60 * hnum);
    mnum = Math.floor(minutes);
    if (String(mnum).length == 1) {
        mnum = "0" + mnum;
    }
    seconds = (now - grt) / 1000 - (24 * 60 * 60 * dnum) - (60 * 60 * hnum) - (60 * mnum);
    snum = Math.round(seconds);
    if (String(snum).length == 1) {
        snum = "0" + snum;
    }
    document.getElementById("timeDate").innerHTML = " 本站已各种夹缝中安全运行 " + dnum + " 天 ";
    document.getElementById("times").innerHTML = hnum + " 小时 " + mnum + " 分 " + snum + " 秒";
}
setInterval("createtime()", 250);
</script>

<!-- 添加网站运行时间》-->
  </div>
  
  <div class="statistics">
    
    

    
      
        <!-- 不蒜子统计PV -->
        <span id="busuanzi_container_site_pv" style="display: none">
            总访问量 
            <span id="busuanzi_value_site_pv"></span>
             次
          </span>
      
      
        <!-- 不蒜子统计UV -->
        <span id="busuanzi_container_site_uv" style="display: none">
            总访客数 
            <span id="busuanzi_value_site_uv"></span>
             人
          </span>
      
    
  </div>


  

  
</footer>


  <!-- SCRIPTS -->
  
  <script  src="https://cdn.jsdelivr.net/npm/nprogress@0.2.0/nprogress.min.js" ></script>
  <link  rel="stylesheet" href="https://cdn.jsdelivr.net/npm/nprogress@0.2.0/nprogress.min.css" />

  <script>
    NProgress.configure({"showSpinner":false,"trickleSpeed":100})
    NProgress.start()
    window.addEventListener('load', function() {
      NProgress.done();
    })
  </script>


<script  src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" ></script>
<script  src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.min.js" ></script>
<script  src="/js/events.js" ></script>
<script  src="/js/plugins.js" ></script>

<!-- Plugins -->


  
    <script  src="/js/img-lazyload.js" ></script>
  



  



  <script  src="https://cdn.jsdelivr.net/npm/tocbot@4.12.3/dist/tocbot.min.js" ></script>



  <script  src="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.js" ></script>



  <script  src="https://cdn.jsdelivr.net/npm/anchor-js@4.3.1/anchor.min.js" ></script>



  <script defer src="https://cdn.jsdelivr.net/npm/clipboard@2.0.8/dist/clipboard.min.js" ></script>



  <script  src="/js/local-search.js" ></script>



  <script defer src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js" ></script>




  <script  src="https://cdn.jsdelivr.net/npm/typed.js@2.0.12/lib/typed.min.js" ></script>
  <script src="https://sdk.jinrishici.com/v2/browser/jinrishici.js" charset="utf-8"></script>

  <script>
    function typing(id, title){
        var typed = new Typed('#' + id, {
            strings: [
              '  ',
              title + "&nbsp;",
            ],
            cursorChar: "❤",
            typeSpeed: 150,
            loop: false,
        });
        typed.stop();
        $(document).ready(function () {
            $(".typed-cursor").addClass("h2");
            typed.start();
        });
    }

    
        typing("subtitle", document.getElementById('subtitle').title)
    

  </script>













  
<script src="//cdn.jsdelivr.net/gh/bynotes/texiao/source/js/yinghua.js"></script>



<!-- 主题的启动项 保持在最底部 -->
<script  src="/js/boot.js" ></script>

</body>
</html>
